为什么R在不同的年份中不一致地处理夏令时?

为什么R在不同的年份中不一致地处理夏令时?,r,date,timezone,dst,posixct,R,Date,Timezone,Dst,Posixct,在“美国/底特律”和“格林尼治标准时间”之间转换时间戳时,我遇到了一个奇怪的情况。经过仔细检查,我发现在2010年和2011年,夏令时当天凌晨1点到2点之间的R转换时间有所不同。2010年,它将这些时间列为“EDT”,2011年,它将这些时间列为“EST”。结果是,在一种情况下,转换为格林尼治标准时间增加了4小时,在另一种情况下增加了5小时。她能告诉任何人这种情况并提出纠正这种不一致的解决方案吗 a = as.POSIXct("2010-11-07 01:58:00", tz = "Americ

在“美国/底特律”和“格林尼治标准时间”之间转换时间戳时,我遇到了一个奇怪的情况。经过仔细检查,我发现在2010年和2011年,夏令时当天凌晨1点到2点之间的R转换时间有所不同。2010年,它将这些时间列为“EDT”,2011年,它将这些时间列为“EST”。结果是,在一种情况下,转换为格林尼治标准时间增加了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"

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

两者都是正确的,因为您没有指定您的意思

此操作系统库代码(可能)将使用迭代算法,在导出的
time\t
值与传递给
mktime
struct tm
值一致时结束。因此,结果基本上是随机的

下面是一个例子:


您的示例为我提供了
“2010-11-07 05:58:00”“2011-11-06 05:58:00”
在R版本为3.2.2的Linux上。我在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
。如果结果是随机的,你的解释对我来说更有意义,但这些结果在计算机、操作系统和R版本之间是一致的。这对我来说意味着R使用了一套规则来分配时区,这在不同年份之间是不一致的?我试了很多次,似乎2011年它在2011-11-06 01:50:00从EDT切换到EST,2010年它在2010-11-07 01:58:23从EDT切换到EST。有人知道在哪里可以找到这些规则的定义吗?@user5270480“本质上是随机的”,我的意思是你不能依赖它们。您可能会从不同的平台获得不同的结果,甚至可能在同一平台上从不同时间进行的调用中获得不同的结果。我的回答是,规则无法定义,因为您的输入不明确。谢谢您的澄清。我能够写一份工作来解决我的具体问题。在我看来,对于这样的歧义,R最好提供NA的结果,但至少现在我知道它发生了,我可以在将来寻找它。