2016-06-07 85 views
5
t.ct = as.POSIXct("2009-01-05 14:19 +1200", format="%Y-%m-%d %H:%M %z") 
t.lt = as.POSIXlt("2009-01-05 14:19 +1200", format="%Y-%m-%d %H:%M %z") 
t.st = strptime("2009-01-05 14:19 +1200", format="%Y-%m-%d %H:%M %z") 

設置時區在POSIXct,POSIXlt,strptime等,這些似乎是同一時間:確定和R中

> t.ct -t.lt 
Time difference of 0 secs 
> t.ct -t.st 
Time difference of 0 secs 
> str(t.ct) 
POSIXct[1:1], format: "2009-01-04 21:19:00" 
> str(t.lt) 
POSIXlt[1:1], format: "2009-01-04 21:19:00" 
> str(t.st) 
POSIXlt[1:1], format: "2009-01-04 21:19:00" 
> 

但這些似乎有他們不同的時區信息,它是不是我期望:

>  strftime(t.ct,"%Y-%m-%d %H:%M:%S %z") 
[1] "2009-01-04 21:19:00 -0500" 
>  strftime(t.lt,"%Y-%m-%d %H:%M:%S %z") 
[1] "2009-01-04 21:19:00 +1200" 
>  strftime(t.st,"%Y-%m-%d %H:%M:%S %z") 
[1] "2009-01-04 21:19:00 +1200" 
> 

我的Mac上的時區是:

> Sys.timezone() 
[1] "America/New_York" 

問題Difference between as.POSIXct/as.POSIXlt and strptime for converting character vectors to POSIXct/POSIXltas.POSIXlt ignores tz argument似乎有關,但沒有爲我澄清這一點。

我如何明確設定時間並使用它?

更新:

從下面user3293236的回答,似乎每個人都應該申報的字符串時區,如果你正在解析「-hhmm」偏移,則始終使用tz="UTC"

t.ct = as.POSIXct("2009-01-05 14:19 +1200", format="%Y-%m-%d %H:%M %z", tz="UTC") 
t.lt = as.POSIXlt("2009-01-05 14:19 +1200", format="%Y-%m-%d %H:%M %z", tz="UTC") 
t.st = strptime("2009-01-05 14:19 +1200", format="%Y-%m-%d %H:%M %z", tz="UTC") 

回答

5

如果您沒有專門使用時區,POSIXct和POSIXlt會引用您當地的時區。但是,這並不完全可靠。 POSIXlt不會在輸出字符串中顯示時區。

請注意,tzone參數未設置。

t.ct <- as.POSIXct("2009-01-05 14:19 +1200", format="%Y-%m-%d %H:%M %z") 
t.lt <- as.POSIXlt("2009-01-05 14:19 +1200", format="%Y-%m-%d %H:%M %z") 
t.ct 
t.lt 
attr(t.ct,"tzone") #"" 
attr(t.lt,"tzone") #NULL 

如果您確實想避免模棱兩可的行爲,您必須指定一個時區。輸出字符串將仍然是不同的(默認情況下POSIXlt顯示沒有時區),但屬性是一樣的

t.ct <- as.POSIXct("2009-01-05 14:19 +1200", format="%Y-%m-%d %H:%M %z", tz="Europe/Helsinki") 
t.lt <- as.POSIXlt("2009-01-05 14:19 +1200", format="%Y-%m-%d %H:%M %z", tz="Europe/Helsinki") 
t.ct 
t.lt 
attr(t.ct,"tzone") #Europe/Helsinki 
attr(t.lt,"tzone") #Europe/Helsinki 

現在,如果你想在原來的轉讓後,更改時區:

attr(t.ct, "tzone") <- "UTC" #this will SHIFT the time zone to UTC 
attr(t.lt, "tzone") <- "UTC" #this will REPLACE the time zone to UTC 
t.ct 
t.lt 

至於你的問題strftime%z,這不會給你時區的屬性。你的情況不同,可能來自字符串格式化,對象轉換和時區格式化組合。但也許有人知道更多,可以澄清這一點。

+0

哦,這是一個可怕的默認值。 '?strptime'示例'strptime(「Tue,2010年3月23日14:36:38 -0400」,「%a,%d%b%Y%H:%M:%S%z」) '應該設置'tz ='UTC',並且注意它在其他示例中表示本地。感謝attr(x,'tzone')的提示。我想對於POSIXct來說,tzone屬性是對象的默認報告時區,但對於POSIXlt,它似乎確實調整了原點。 –