DST 前后的 POSIXct 时间?

Posted

技术标签:

【中文标题】DST 前后的 POSIXct 时间?【英文标题】:POSIXct times around DST? 【发布时间】:2010-11-26 14:24:13 【问题描述】:

我想从 POSIX 日期中减去 1 天,并在 DST 前后同时结束。

例如,当我添加一天时:

> as.POSIXct('2009-03-08 23:00:00.000') + 86400
[1] "2009-03-09 23:00:00 EDT"

但是当我过去时,它会偏移:

> as.POSIXct('2009-03-08 23:00:00.000') - 86400
[1] "2009-03-07 22:00:00 EST"

处理夏令时前后绝对时差的最佳方法是什么?通常我通过将时间转换为字符串并分别处理它们来处理这个问题,这样就不会应用 DST。

【问题讨论】:

【参考方案1】:

您的代码完全按照您的要求执行,因为您没有要求它加减一天,而是要求它加减24 小时2009-03-08 23:00:00 EDT 之前的 24 小时(86400 秒) 2009-03-07 22:00:00 EST。我不熟悉 R 库,但我熟悉它们包装的 POSIX 函数。如果您使用 POSIXct,将其 day 属性减 1,然后通过 POSIXlt 将其“重新转换”为 POSIXct(以确保例如 2 月 -1 日变为 1 月 31 日),那么您应该能够减去一天可靠。

【讨论】:

【参考方案2】:

将日期时间存储为 UTC - 或者在这种情况下转换为 UTC 减去一天并转换回本地时间。 (这忽略了闰秒)

【讨论】:

如果我转换为 UTC,减去一天,然后再转换回来,我将得到相同的偏移量,因为转换中仍应用 DST。对吗? 如果在 DST 的第一天,则取决于实际日期,否则没有。但将所有日期时间视为 UTC,并且仅在最后一刻格式化为本地时间【参考方案3】:

感谢霍布斯!我需要做更多的工作,但在 POSIXlt 中从天槽中减去:

> a <- as.POSIXct('2009-03-08 23:00:00.000')
> as.POSIXlt(a)
[1] "2009-03-08 23:00:00 EDT"
> a <- as.POSIXlt(a)
> a$mday <- a$mday -1
> a
[1] "2009-03-07 23:00:00 EDT"

【讨论】:

【参考方案4】:

如果你只是想计算天数,你可以使用trunc来移动天数:

> trunc(Sys.time(), "day") + 86400
[1] "2009-09-13 PDT"
> trunc(Sys.time(), "day") - 86400
[1] "2009-09-11 PDT"

【讨论】:

【参考方案5】:

lubridate 提供了两个额外的时间跨度类,它们指定了基本包中有些不清楚的内容。来自手册:

持续时间

持续时间测量两个瞬间之间发生的确切时间量。如果闰秒、闰年或夏令时 (DST) 发生变化,这可能会在时钟时间方面产生意外结果。

期间

周期衡量两个瞬间之间发生的时钟时间变化。在存在闰秒、闰年和 DST 变化的情况下,周期可提供对时钟时间的可靠预测。

【讨论】:

以上是关于DST 前后的 POSIXct 时间?的主要内容,如果未能解决你的问题,请参考以下文章

过滤某些月份的 POSIXct 日期时间

ggplot 时间序列图错误:输入无效:time_trans 仅适用于 POSIXct 类的对象,但数据在 POSIXct 中

R中从POSIXct到日期的日期转换

xts 函数不将我的 POSIXct 日期视为适当的基于时间的对象

xts 函数不将我的 POSIXct 日期视为适当的基于时间的对象

使用 POSIXct 和夏令时绘制条形图