在R中确定并设置POSIXct,POSIXlt,strptime等中的时区

Dav*_*e X 6 datetime r

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")
Run Code Online (Sandbox Code Playgroud)

这些似乎是同一时期:

> 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"
> 
Run Code Online (Sandbox Code Playgroud)

但这些似乎有不同的时区信息,这不是我所期望的:

>     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"
> 
Run Code Online (Sandbox Code Playgroud)

我的Mac上的时区是:

> Sys.timezone()
[1] "America/New_York"
Run Code Online (Sandbox Code Playgroud)

问题as.POSIXct/as.POSIXlt与用于将字符向量转换为POSIXct/POSIXltas.POSIXlt的strptime之间的区别忽略了tz参数似乎相关,但没有为我澄清这一点.

我如何明确地设定时间并使用它?

更新:

从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")
Run Code Online (Sandbox Code Playgroud)

use*_*236 9

如果您没有专门使用时区,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
Run Code Online (Sandbox Code Playgroud)

如果您确实想避免模糊行为,则必须指定时区.输出字符串仍然不同(默认情况下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
Run Code Online (Sandbox Code Playgroud)

现在,如果要在原始分配后更改时区:

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
Run Code Online (Sandbox Code Playgroud)

至于你的问题strftime%z,这不会给你时区属性.你的情况有所不同,可能来自字符串格式化,对象转换和时区格式化,IMO.但也许更有知识的人可以澄清这一点.