为啥 R 在多年之间不能始终如一地处理夏令时?

Posted

技术标签:

【中文标题】为啥 R 在多年之间不能始终如一地处理夏令时?【英文标题】:Why does R not handle daylight savings consistently among years?为什么 R 在多年之间不能始终如一地处理夏令时? 【发布时间】:2015-11-21 03:33:20 【问题描述】:

我在“美国/底特律”和“格林威治标准时间”之间转换时间戳时遇到了一个奇怪的情况。经过仔细检查,我发现 R 在 2010 年和 2011 年夏令时结束的那一天凌晨 1 点到 2 点之间转换的时间不同。2010 年,它将这些时间列为“EDT”,2011 年将这些时间列为“EST”。结果是转换为 GMT 在一种情况下增加了 4 小时,在另一种情况下增加了 5 小时。任何人都可以阐明这种情况并提出纠正这种不一致的解决方案吗?

a = as.POSIXct("2010-11-07 01:58:00", tz = "America/Detroit")
#[1] "2010-11-07 01:58:00 EDT"

b = as.POSIXct("2011-11-06 01:58:00", tz = "America/Detroit")
# [1] "2011-11-06 01:58:00 EST"

format(c(a,b), tz = "GMT")
# [1] "2010-11-07 05:58:00" "2011-11-06 06:58:00"

【问题讨论】:

你的例子在 R 版本 3.2.2 的 Linux 上给了我"2010-11-07 05:58:00" "2011-11-06 05:58:00" 我在 OSX 版本 3.2.2、Windows 版本 3.1.1 和 3.1.3 以及 Linux 版本 3.1.3 上进行了尝试,每次都得到相同的结果。 zoneinfo 文件是否可能已过期? 刚刚注意到在我的机器上,b 的结果是 "2011-11-06 01:58:00 EDT",而不是 EST 【参考方案1】:

你给出的时间是模棱两可的。由于时钟在 2 点“倒退”,因此这些天的当地时间 1:58 每天出现两次,一次在美国东部时间,一次在美国东部时间。

两者都是正确的,因为您没有具体说明您的意思。

为此的操作系统库代码将(可能)使用迭代算法,当派生的time_t 值与传递给mktimestruct tm 值一致时结束。因此,结果基本上是随机的。

这是一个例子:

http://www.opensource.apple.com/source/ntp/ntp-13/ntp/libntp/mktime.c

【讨论】:

如果结果是随机的,您的解释对我来说会更有意义,但这些结果在计算机、操作系统和 R 版本之间是一致的。这向我表明 R 正在使用一组规则来分配时区,这些规则在年份之间并不一致?我只是尝试了很多不同的时间,似乎在 2011 年它在 2011-11-06 01:50:00 从 EDT 切换到 EST,而在 2010 年它在 2010-11-07 01:58 从 EDT 切换到 EST: 23.有谁知道在哪里可以找到这些规则的定义位置? @user5270480 “基本上随机”是指你不能依赖它们。您可能会从不同的平台获得不同的结果,甚至可能在同一平台上通过不同时间的调用获得不同的结果。我在这个答案中的观点是无法定义规则,因为您的输入不明确。 感谢您的澄清。我能够写一个变通方法来解决我的具体问题。在我看来,R 最好为这种模糊性提供 NA 的结果,但至少现在我知道它发生了,我可以在未来寻找它。

以上是关于为啥 R 在多年之间不能始终如一地处理夏令时?的主要内容,如果未能解决你的问题,请参考以下文章

为啥减去两个本地 DateTime 值似乎不能说明夏令时?

为啥这个 Joda 偏移不能正确实现夏令时

在 R 中处理东部标准时间 (EST) 和东部夏令时 (EDT)

计算夏令时和非夏令时之间的时间差

在计算 DateTimes 之间的持续时间时安全处理夏令时(或任何其他理论上的非常量偏移)

即使在 Java 中未选中 Systems Daylight 选项,也始终使用 Java 中的夏令时获取时区