2013-03-14 242 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