我想计算夏令时和非夏令时之间的时差。但我不知道如何让R知道时间是夏令时。
例如,凤凰城夏季不会调整夏令时,而美国的大多数地区都会这样做。如果我想计算下面的时间差,它应该是3小时而不是2小时。 tzone =" America / Phoenix"会自动将时间设置为" MST",这是一个夏令时,但这不是我想要的。
library(lubridate)
x <- "22/5/2016 23:50"
x <- dmy_hm(x)
x1 <- force_tz(x, tzone = "America/Phoenix")
x2 <- force_tz(x, tzone = "EST")
x1-x2
# The output is "Time difference of 2 hours". But actually it is supposed to be 3 hours.
我试过设置tzone =&#34; EDT&#34;或&#34; MDT&#34;解决这个问题。但似乎R不允许识别那些时区。
> x2 <- force_tz(y, tzone = "EDT")
Warning messages:
1: In as.POSIXct.POSIXlt(lt) : unknown timezone 'EDT'
2: In as.POSIXlt.POSIXct(ct) : unknown timezone 'EDT'
> x3 <- force_tz(y, tzone = "MDT")
Warning messages:
1: In as.POSIXlt.POSIXct(x, tz) : unknown timezone 'EDT'
2: In as.POSIXct.POSIXlt(lt) : unknown timezone 'MDT'
3: In as.POSIXlt.POSIXct(ct) : unknown timezone 'MDT'
答案 0 :(得分:3)
由于EST
,您遇到了问题。来自?timezone
:
请注意,其中一些名称可能不符合您的预期:in 特别是EST是加拿大使用的时区,没有夏令时 时间...
使用US/Eastern
或America/New_York
代替EST
。有关详细信息,请参阅?OlsonNames()
。
#DST
x1 = as.POSIXct("22/5/2016 23:50", format = "%d/%m/%Y %H:%M", tz = "America/New_York")
x2 = as.POSIXct("22/5/2016 23:50", format = "%d/%m/%Y %H:%M", tz = "America/Phoenix")
x2 - x1
#Time difference of 3 hours
#NOT DST
x1 = as.POSIXct("22/12/2016 23:50", format = "%d/%m/%Y %H:%M", tz = "America/New_York")
x2 = as.POSIXct("22/12/2016 23:50", format = "%d/%m/%Y %H:%M", tz = "America/Phoenix")
x2 - x1
#Time difference of 2 hours
答案 1 :(得分:2)
这是一种方法。为方便起见,我使用anytime()
(来自anytime包)
R> nyc <- format(anytime("12/05/2016 23:50", tz="America/New_York"))
R> phx <- format(anytime("12/05/2016 23:50", tz="America/Phoenix"))
R> diff(anytime(c(phx, nyc)))
Time difference of 2 hours
R>
您必须经历明确的文本表示(这是浪费的),因为底层表示始终是UTC:
R> difftime(anytime("12/05/2016 23:50", tz="America/New_York"),
+ anytime("12/05/2016 23:50", tz="America/Phoenix"))
Time difference of 0 secs
R>
期望/怀疑的三个小时差异仅在夏季发生。用7月而不是12月:
R> phx <- format(anytime("07/05/2016 23:50", tz="America/Phoenix"))
R> nyc <- format(anytime("07/05/2016 23:50", tz="America/New_York"))
R> diff(anytime(c(phx, nyc)))
Time difference of 3 hours
R>
当然,使用Base R函数可以完成所有使用anytime()
完成的操作。这只是一个捷径,而这一切都归结为POSIXt
如何处理这个问题。
编辑:我忘了我在另一个包中有另一个帮手:
R> RcppCCTZ::tzDiff("America/Phoenix", "America/New_York", anytime("2016-05-22"))
[1] 3
R>
答案 2 :(得分:0)
&#34; S&#34;在MST和EST中代表&#34;标准。&#34;这总是非夏令时版本。你想在东部白天使用EDT。