【问题标题】:converting seconds from the Epoch into localtime将纪元的秒数​​转换为本地时间
【发布时间】:2013-03-02 05:32:43
【问题描述】:

假设我有几个从 Unix 纪元 (1970-01-01 00:00:00Z) 以整数(秒)形式给出的时间戳。

如何将它们转换为当地时区的正确日期时间?我一直在查看as.POSIXct 帮助页面以及关于 SO 的相关问题。在 UTC 中很容易做到,但由于某种原因,我似乎无法直接在当地时区或另一个时区做到这一点(顺便说一句,我碰巧在“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"

顺便说一句,在我的系统上:

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"

【问题讨论】:

    标签: r timezone epoch posixct


    【解决方案1】:

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

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

    【讨论】:

    • 太棒了。作品!但是,在我看来,文档是错误的。请参阅?as.POSIXct 的示例。
    • 此外,origin=as.Date('1970-01-01')origin='1970-01-01' 甚至是非常具体的origin='1970-01-01 00:00:00Z' 之间存在差异这一事实并不能激发我对内心深处的内在信心。 ..
    • @PierreD,这是一个错误 (LINK)。它已在 R-devel 中修复。
    【解决方案2】:

    您需要区分解析/存储为 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> 
    

    【讨论】:

    • 但是,这些时间不等于"2013-02-10 12:15:17 PST" "2013-03-11 09:34:25 PDT"
    • 是的,我知道您可以在您选择的任何时区显示时间。那不是问题。 @GSee 真正确定了这项工作的原因:关键是使用origin=as.Date('1970-01-01') 而不是origin='1970-01-01',因为帮助页面错误地显示。前者有效,后者无效。
    猜你喜欢
    • 1970-01-01
    • 2019-10-16
    • 2023-04-09
    • 2012-03-08
    • 1970-01-01
    • 2015-12-22
    • 2023-03-03
    • 2020-08-03
    • 2013-01-18
    相关资源
    最近更新 更多