在R语言中确定和设置POSIXct、POSIXlt、strptime等的时区

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

这些似乎是相同的时间:


> 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")
1个回答

11

如果您没有明确使用时区,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 遇到的问题,这并不会给您提供时区属性。在您的情况下,差异可能来自于字符串格式化、对象转换和时区格式化的组合。但是,也许有更了解的人可以澄清这一点。


哦,那是一个糟糕的默认设置。?strptime示例strptime("Tue, 23 Mar 2010 14:36:38 -0400", "%a, %d %b %Y %H:%M:%S %z")应该设置tz='UTC',并注意它在其他示例中表示本地时间。感谢提供关于attr(x,'tzone')的说明。我想对于POSIXct,tzone属性是对象的默认报告时区,但对于POSIXlt,它似乎会调整原点。 - Dave X
我该如何将时区的显示从“+1200”更改为“+12:00”? “%z”只会显示为“+1200”。 - PM0087

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接