将Epoch中的秒数转换为本地时间

时间:2013-03-14 01:27:33

标签: r timezone epoch posixct

假设我有几个时间戳来自Unix Epoch(1970-01-01 00:00:00Z)的整数(秒)。

如何将它们转换为当地时区的正确日期时间?我一直在查看as.POSIXct帮助页面以及有关SO的相关问题。在UTC中很容易做到,但由于某些原因,我似乎无法直接为当地时区或其他时区(BTW,我恰好在“America / Los_Angeles”或“PST5PDT”中执行此操作,变为“PST或”PDT“取决于白天节省是否在指定时间生效;因此我通常指定基于位置的时区而不是”PST“或”PDT“,这是挑剔的。)

示例设置:

z <- c(1360527317,1363019665)

perl中的快速验证:

echo -n 1360527317,1363019665 | perl -ne '
use POSIX /strftime/;
$fmt = "%Y-%m-%d %H:%M:%S";
for (split /,/) {
  $loc=strftime("$fmt %Z", localtime($_));
  $gmt=strftime("$fmt GMT", gmtime($_));
  print "$_: $loc $gmt\n";
}'
# gives:
1360527317: 2013-02-10 12:15:17 PST 2013-02-10 20:15:17 GMT
1363019665: 2013-03-11 09:34:25 PDT 2013-03-11 16:34:25 GMT

首先,显而易见的(以UTC格式):

as.POSIXct(z, origin='1970-01-01', tz='GMT')
# --> [1] "2013-02-10 20:15:17 GMT" "2013-03-11 16:34:25 GMT"

以下是我尝试无效的事情

as.POSIXct(z, origin='1970-01-01')
# --> (wrong) [1] "2013-02-10 20:15:17 PST" "2013-03-11 17:34:25 PDT"

as.POSIXct(z, origin='1970-01-01 00:00:00 Z')
# --> (wrong) [1] "2013-02-10 20:15:17 PST" "2013-03-11 17:34:25 PDT"

as.POSIXct(z, origin='1970-01-01', tz='America/Los_Angeles')
# --> (wrong) [1] "2013-02-10 20:15:17 PST" "2013-03-11 17:34:25 PDT"

在我的智慧结束时,这里有一些东西给我正确的结果

now=Sys.time(); now+(z-unclass(now))
# --> [1] "2013-02-10 12:15:17 PST" "2013-03-11 09:34:25 PDT"

在我的系统上BTW:

now=Sys.time()
now
# --> [1] "2013-03-13 18:26:05 PDT"
unclass(now)
# --> [1] 1363224365

所以看来我的设置和当地时区都是正确的。

知道我在上面没有用的线路上做错了吗?

与此同时,我将使用以下技巧,希望对其他人有用:

localtime <- function(t) {
  now = Sys.time();
  return(now+(unclass(t)-unclass(now)))
}
# quick test:
localtime(Sys.time())
# --> [1] "2013-03-13 18:33:40 PDT"
localtime(z)
# --> [1] "2013-02-10 12:15:17 PST" "2013-03-11 09:34:25 PDT"

2 个答案:

答案 0 :(得分:1)

尝试将Date传递给origin而不是字符串

as.POSIXct(z, origin=as.Date('1970-01-01'), tz='America/Los_Angeles')

答案 1 :(得分:1)

您需要将解析/存储区分为UTC

R> pt <- as.POSIXct(z, origin=as.Date("1970-01-01"))
R> pt
[1] "2013-02-10 14:15:17 CST" "2013-03-11 11:34:25 CDT"

现在,您可以在任何TZ中显示:

R> format(pt, tz="America/Chicago")
[1] "2013-02-10 14:15:17" "2013-03-11 11:34:25"
R> format(pt, tz="America/Los_Angeles")
[1] "2013-02-10 12:15:17" "2013-03-11 09:34:25"
R>