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

Posted

技术标签:

【中文标题】计算夏令时和非夏令时之间的时间差【英文标题】:Calculate time differences between daylight saving time and non-daylight saving time 【发布时间】:2017-07-11 14:46:04 【问题描述】:

我想。但我不知道如何让 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="EDT" 或 "MDT" 来解决这个问题。但似乎 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'

【问题讨论】:

夏天三个小时,而不是冬天。看我的回答。 谢谢,德克!您的代码有效。但我在代码中的意思是夏令时。我把日期放在月份的前面。为了澄清这一点,我将原始日期修改为 22/5/2016 啊。这是一种常见的日期格式,但很容易出错(至少在世界的这个地区)。最好坚持2016-05-22。 【参考方案1】:

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

请注意,其中一些名称可能不是您所期望的:在 特定的 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

【讨论】:

【参考方案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> 

当然,这里使用anytime() 完成的所有操作都可以使用 Base R 函数完成。这只是一个捷径,这一切都归结为POSIXt 的处理方式。

编辑:我忘了我在另一个包中有另一个助手:

R> RcppCCTZ::tzDiff("America/Phoenix", "America/New_York", anytime("2016-05-22"))
[1] 3
R> 

【讨论】:

【参考方案3】:

MST 和 EST 中的“S”代表“标准”。这始终是非夏令时版本。您想将 EDT 用于东部夏令时间。

【讨论】:

但是 R 不能识别时区,例如“EDT”。 "EST5EDT" 也许。 “东部时间”以含糊不清着称,因为澳大利亚人有自己的“东部”区域。 (而“美国人”在他们的假设中是出了名的孤立无援。)

以上是关于计算夏令时和非夏令时之间的时间差的主要内容,如果未能解决你的问题,请参考以下文章

在计算 DateTimes 之间的持续时间时安全处理夏令时(或任何其他理论上的非常量偏移)

没有夏令时的日期计算

为啥 R 在多年之间不能始终如一地处理夏令时?

LON 和 SYD 之间的时差为 9 小时,夏令时

夏令时计算

仅从日期计算夏令时