我无法理解 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")不可能。
指定的时区必须来自IANA TZ 数据库。您可以在此处找到所有受支持时区的列表。CEST不在名单上。
通常,TZDB 中的标识符由以下形式组成:
Area/Locality为America/Los_Angeles、Europe/Paris、 或Pacific/Honolulu。
America/Indiana/KnoxEtc/UTC,Etc/GMT-3或Etc/GMT+5。
US/Central,Canada/Atlantic和Egypt。
EST5EDT.
CET和EST。
CST可能是北美的中部标准时间,也可能属于古巴、中国或澳大利亚。CEST乍一看似乎没有歧义,但请考虑到许多不同的 IANA 时区使用相同的缩写,即使它们在其历史上的某个时刻可能有所不同。