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 时间?的主要内容,如果未能解决你的问题,请参考以下文章
ggplot 时间序列图错误:输入无效:time_trans 仅适用于 POSIXct 类的对象,但数据在 POSIXct 中
xts 函数不将我的 POSIXct 日期视为适当的基于时间的对象