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

时间:2017-02-21 19:40:50

标签: r time dst

我想计算夏令时和非夏令时之间的时差。但我不知道如何让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'

3 个答案:

答案 0 :(得分:3)

由于EST,您遇到了问题。来自?timezone

  

请注意,其中一些名称可能不符合您的预期:in   特别是EST是加拿大使用的时区,没有夏令时   时间...

使用US/EasternAmerica/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。