从保存为字符的日期时间转换为 R 中的 POSIXct 时如何自动识别时区?

How to automatically recognise timezone when converting from a datetime saved as character to POSIXct in R?

我正在尝试将 POSIXct 日期时间保存为带时区的字符串,然后将其转换回具有正确时区的原始 POSIXct 日期时间。在反向转换中,我希望从字符串中识别时区,而不必手动指定它。

看起来很简单,但我还没有找到一种方法来做到这一点:我似乎必须手动指定时区(参见下面的顶部示例)或反向转换失败(参见底部示例) .

非常感谢任何建议。

# This works, but I'm manually specifying the timezone on the third line. I want to do this automatically.
dt = as.POSIXct('2021-01-01 00:00:00', tz = 'Pacific/Auckland') #"2021-01-01 NZDT"
char = format(dt, '%Y%m%dT%H%M%OS%z') #20210101T000000+1300 (+1300 = NZDT)
as.POSIXct(char, format = '%Y%m%dT%H%M%OS', tz = 'Pacific/Auckland') #2021-01-01 NZDT. Note manually specifying timezone, which I dont want to do.

# Now trying to automatically specify timezone via '%Z' on the third line. This returns NA.  
dt = as.POSIXct('2021-01-01 00:00:00', tz = 'Pacific/Auckland')
char = format(dt, '%Y%m%dT%H%M%OS%z') #"20210101T000000+1300"
as.POSIXct(char, format = '%Y%m%dT%H%M%OS%z') #NA. Note I'm trying to automatically specify timezone via '%Z' 

如果您将原始时区强制输入 char 字符串会怎样?例如:

dt <- as.POSIXct('2021-01-01 00:00:00', tz = 'Pacific/Auckland')
dt
#[1] "2021-01-01 NZDT"

char <- format(dt, paste("%Y%m%dT%H%M%OS", attr(dt, "tzone")) )
char
#[1] "20210101T000000 Pacific/Auckland"

然后你可以通过在第一个 space:

处分开来提取日期时间部分和时区部分来取回它
as.POSIXct(
  sub("\s.+$", "", char),
  format = "%Y%m%dT%H%M%OS",
  tz     = sub("^.+\s", "", char[1])
)
#[1] "2021-01-01 NZDT"