2016-06-07 11 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") 

vb POSIXct, POSIXlt, strptime, saat dilimini ayarlayın:Bunlar aynı kat görünmektedir belirleyin ve Ar

> 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" 
> 

Ama bunlar içlerinde farklı zaman dilimi bilgi sahibi olmak görünür ve öyle Ben beklediğiniz gibi değil:

>  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" 
> 

benim Mac üzerinde saat dilimidir:

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

Difference between as.POSIXct/as.POSIXlt and strptime for converting character vectors to POSIXct/POSIXlt ve as.POSIXlt ignores tz argument soruları ilgili görünüyordu, ancak bunu benim için açıklığa kavuşturmadı.

Zamanı nasıl belirleyebilir ve kullanabilirim?

Güncelleme:

aşağıda user3293236 cevabı itibaren

, bir zaman dize dilimini beyan ve ayrıştırma eğer '-hhmm' offset sonra hep kullanmalıdır görünüyor 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") 

cevap

5

Belirli bir saat dilimini kullanmazsanız, POSIXct ve POSIXlt yerel saat diliminize başvurur. Ancak, bu tamamen güvenilir değildir. POSIXlt, çıkış dizesinde saat dilimini göstermez.

Not, tzone argümanı ayarlanmamış.

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 

Belirsiz davranışlardan kaçınmak istiyorsanız, bir saat dilimini belirtmeniz gerekir. çıkış dizesi hala farklı olacaktır (varsayılan olarak POSIXlt hiçbir zaman dilimini göstermektedir), ancak orijinal görevden sonra saat dilimlerini değiştirmek isterseniz nitelik, Şimdi aynı

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 

geçerli:

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 ve %z ile ilgili sorununuz için, bu size saat dilimi özelliğini vermez. Davanızdaki fark, muhtemelen dize biçimlendirmesi, nesne dönüşümleri ve saat dilimi oluşturma, IMO'nun bir kombinasyonundan gelir. Ama belki birileri daha bilgili olabilir, bunu açıklayabilir.

+0

Oh, bu korkunç bir varsayılan. "Strptime" örnek strptime ("Sal, 23 Mar 2010 14:36:38 -0400", "% a,% d% b% Y% H:% M:% S% z") 'ayarlanmalıdır 'tz = 'UTC', ve diğer örneklerde yerel anlamına geldiğini unutmayın. Attr (x, 'tzone') notu için teşekkürler. POSIXct için, tzone özniteliğinin nesne için varsayılan raporlama zaman dilimi olduğunu sanıyorum, ancak POSIX için, orijini ayarlamak gibi görünüyor. –