2013-03-14 243 views
1

假设我有几个时间戳以Unix Epoch(1970-01-01 00:00:00Z)中的整数(秒)给出。将时间秒从时间转换为本地时间

如何将它们转换为当地时区的正确日期时间?我一直在寻找as.POSIXct帮助页面以及SO上的相关问题。 UTC很容易做到,但出于某种原因,我似乎无法直接为当地时区或另一个时区(顺便说一下,我恰好在“America/Los_Angeles”或“PST5PDT”中成为“PST或”PDT“,具体取决于是否在指定的时间节约时间;因此我通常会指定基于位置的时区,而不是”PST“或”PDT“,这些都是非常有挑战性的)

实施例:

z <- c(1360527317,1363019665) 

快速验证在Pe​​rl:

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" 

回答

1

尝试传递Dateorigin而不是字符串

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

辉煌。作品!但是,它在我看来,文档是错误的。看到'as.POSIXct'的例子。 – 2013-03-14 01:39:41

+0

此外,“origin = as.Date('1970-01-01')”和“origin ='1970-01-01'”,甚至非常具体的“origin ='1970- 01-01 00:00:00Z'并没有激发我对内部深处内部的信心...... – 2013-03-15 01:30:21

+1

@PierreD,这是一个错误([LINK](https://bugs.r- project.org/bugzilla3/show_bug.cgi?id=14973))。它已在R-devel中修复。 – GSee 2013-03-29 19:06:41

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> 
+0

但是,那些时间不等于''2013-02-10 12:15:17 PST“”2013-03-11 09:34:25 PDT“' – GSee 2013-03-14 02:10:04

+0

谢谢,纠正。 – 2013-03-14 02:28:56

+0

是的,我知道你可以在任何你选择的时区显示时间。这不是问题。为什么这个作品真的被@GSee钉住了:关键是使用'origin = as.Date('1970-01-01')'而不是'origin ='1970-01-01'作为帮助页错误地显示。前者的作品,后者没有。 – 2013-03-15 01:25:41