在 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 很难解释。然而,这些结果的随机性使得很难转换这些时期的时间。有没有办法解决这个问题,从而获得更一致的结果?
最佳答案
如果您查看整数表示,您会注意到:
# 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'))
关于R 没有始终如一地转换 DST 时间变化的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53662211/