【问题标题】:Determine and set timezone in POSIXct, POSIXlt, strptime, etc. in R在 R 中的 POSIXct、POSIXlt、strptime 等中确定和设置时区
【发布时间】:2016-10-07 21:30:04
【问题描述】:
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 的问题似乎相关,但并没有为我澄清这一点。

我如何确定并使用它?

更新:

从下面用户 3293236 的回答来看,似乎应该始终声明字符串的时区,如果您正在解析“-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")

【问题讨论】:

    标签: r datetime


    【解决方案1】:

    如果您没有专门使用时区,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 的问题,这并没有给你时区属性。您的情况的差异可能来自字符串格式、对象转换和时区格式的组合,IMO。但也许有更博学的人可以澄清这一点。

    【讨论】:

    • 哦,这是一个糟糕的默认值。 ?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,它似乎确实调整了原点。
    • 如何将时区的显示从+1200 更改为+12:00%z 仅显示为 +1200
    猜你喜欢
    • 2015-05-13
    • 1970-01-01
    • 2012-05-28
    • 2018-06-22
    • 2018-12-25
    • 2017-11-30
    • 2018-03-23
    • 1970-01-01
    相关资源
    最近更新 更多