了解 R 中的时区字符串

RHA*_*RHA 1 timezone r

我无法理解 R 中如何处理时区字符串以及为什么Sys.time()使用与Sys.timezone()?不同的字符串?

Sys.time() 返回:

[1]“2016-05-13 10:17:04 CEST”

as.POSIXct(Sys.time()) 作品:

[1]“2016-05-13 10:17:11 CEST”

并且as.POSIXct("2016-05-1 10:15:21 CEST")也有效:

[1]“2016-05-01 10:15:21 CEST”

然而,as.POSIXct("2016-05-1 10:15:21", tz = "CEST")没有工作:

[1]“2016-05-01 10:15:21 GMT”
警告消息:
1:在 strptime(xx, f <- "%Y-%m-%d %H:%M:%OS", tz = tz) : 未知时区 'CEST'
2: 在 as.POSIXct.POSIXlt(x) : 未知时区 'CEST'
3: 在 strptime(x, f, tz = tz) : 未知时区 'CEST'
4: 在 as.POSIXct .POSIXlt(as.POSIXlt(x, tz, ...), tz, ...) : 未知时区 'CEST'
5: 在 as.POSIXlt.POSIXct(x, tz) : 未知时区 'CEST'

我知道我可以通过以下方式解决问题:

Sys.timezone(location = TRUE)
Run Code Online (Sandbox Code Playgroud)

[1]“欧洲/柏林”

as.POSIXct("2016-05-1 10:15:21", tz = Sys.timezone(location = TRUE))返回:

[1]“2016-05-01 10:15:21 CEST”

但我想了解为什么上述工作会这样?假设我有来自不同时区(比如纽约)的数据,我怎么知道要使用哪个字符串?

编辑: Matt 和 Adams 的回答链接提供了第二个问题的答案:时区可以在 Wikipedia 或lubridate::olson.time.zones.

但是,主要问题仍未得到解答:为什么“2016-05-01 10:15:21 CEST”是有效的POSIXct class,而as.POSIXct("2016-05-1 10:15:21", tz = "CEST")不可能。

Mat*_*int 5

指定的时区必须来自IANA TZ 数据库。您可以在此处找到所有受支持时区的列表CEST不在名单上。

通常,TZDB 中的标识符由以下形式组成:

  • 基于位置的区域,形式Area/LocalityAmerica/Los_AngelesEurope/Paris、 或Pacific/Honolulu
    • 这是最喜欢的格式,您应该尽可能使用它。
    • 有些有两个以上的部分,例如 America/Indiana/Knox
  • 具有固定偏移量的行政区,例如Etc/UTC,Etc/GMT-3Etc/GMT+5
    • 除了 UTC 和 GMT,这些主要用于海上船舶。在陆地上几乎不需要它们。
    • 由于遗留原因,这些字符串中的偏移量的符号反转。
  • 较早的国家特定的区域,如US/CentralCanada/AtlanticEgypt
    • 这些应该被视为已弃用。很久以前它们曾经是区域条目,但现在只是向后兼容的“链接”。
  • 一些比较流行的 POSIX 风格的时区,例如EST5EDT.
    • 也是为了向后兼容。不要使用这些。
    • 有关详细信息,请参阅timezone tag wiki 中有关 posix 时区的部分。
  • 一些常见的时区缩写,例如CETEST
    • 再次,不要使用这些。
    • 在 Wikipedia 上查看此列表并注意有多少重复条目,使缩写有些含糊。例如,CST可能是北美的中部标准时间,也可能属于古巴、中国或澳大利亚。
    • 尽管CEST乍一看似乎没有歧义,但请考虑到许多不同的 IANA 时区使用相同的缩写,即使它们在其历史上的某个时刻可能有所不同。