R 在 DST 时间变化前后不一致地转换时间

Posted

技术标签:

【中文标题】R 在 DST 时间变化前后不一致地转换时间【英文标题】:R not consistently converting time around DST time change 【发布时间】:2019-05-08 18:54:44 【问题描述】:

在 Windows 机器上使用 R

as.POSIXct('2018-11-04 01:30:00', tz = 'America/Chicago')
# "2018-11-04 01:30:00 CDT"

as.POSIXct('2018-11-04 01:40:00', tz = 'America/Chicago')
# "2018-11-04 01:40:00 CST"

我知道这些时间是模棱两可的(技术上可能是 CDT 或 CST)并且 R 可能难以解释。然而,这些结果的随机性使得在这些期间转换时间变得困难。有没有办法解决这个问题,以获得更一致的结果?

【问题讨论】:

【参考方案1】:

如果您查看整数表示,您会注意到:

# divide by 60 to convert to minutes from seconds
as.integer(as.POSIXct('2018-11-04 01:30:00', tz = 'America/Chicago'))/60
# [1] 25688550

as.integer(as.POSIXct('2018-11-04 01:40:00', tz = 'America/Chicago'))/60
# [1] 25688620

这些时间间隔为 70 分钟,这意味着后者对应于如果 CDT 继续,则为 2:40;这对我来说似乎很一致。我无法在快速搜索中找到任何参考,特别是 America/Chicago 时区的夏令时开关的详细信息。

此外,您可以考虑在这种情况下查看POSIXlt 表示:

dput(as.POSIXlt('2018-11-04 01:30:00', tz = 'America/Chicago'))
# structure(list(sec = 0, min = 30L, hour = 1L, mday = 4L, mon = 10L, 
#     year = 118L, wday = 0L, yday = 307L, isdst = 1L, zone = "CDT", 
#     gmtoff = NA_integer_), class = c("POSIXlt", "POSIXt"), tzone = "America/Chicago")

dput(as.POSIXlt('2018-11-04 01:40:00', tz = 'America/Chicago'))
# structure(list(sec = 0, min = 40L, hour = 1L, mday = 4L, mon = 10L, 
#     year = 118L, wday = 0L, yday = 307L, isdst = 0L, zone = "CST", 
#     gmtoff = NA_integer_), class = c("POSIXlt", "POSIXt"), tzone = "America/Chicago")

注意两个对象之间isdst 的区别...

要继续进行,我们确实需要找到有关 CDT/CST 划分方式的权威来源。但是FWIW,切换的确切时间似乎是1:30:05

as.POSIXct('2018-11-04 01:30:05', tz = 'America/Chicago')
# [1] "2018-11-04 01:30:05 CDT"

as.POSIXct('2018-11-04 01:30:06', tz = 'America/Chicago')
# [1] "2018-11-04 01:30:06 CST"

(为了弄清楚这一点,我查看了以下输出:)

with(expand.grid(second = 0:59, minute = 30:40),
     as.POSIXct(sprintf('2018-11-04 01:%02d:%02d', minute, second),
                tz = 'America/Chicago'))

【讨论】:

为您提供一些参考资料 here 和 here。另外,您可以阅读TZ数据库的northamerica文件中的实现和cmets(区域America/Chicago和规则US 需要明确的是,过渡不是在 1:30:05。 2018 年 11 月 4 日,随着芝加哥当地时间接近 02:00,它重置为 01:00,重复从 01:00 到 01:59 的时间。换句话说,时钟滴答作响01:58 CDT01:59 CDT01:00 CST01:01 CST...

以上是关于R 在 DST 时间变化前后不一致地转换时间的主要内容,如果未能解决你的问题,请参考以下文章

在 R 中格式化具有不一致日期格式的向量

如何使MySQL前后端连接SESSION变量保持一致

R geom_histogram position="identity" 不一致

Python图像resize前后颜色不一致问题

canvas 绘图画出的线条粗细不一致

Word 信头生成宏不会一致地应用格式