【问题标题】:POSIXct times around DST?DST 前后的 POSIXct 时间?
【发布时间】: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。

【问题讨论】:

    标签: r dst date-arithmetic posixct


    【解决方案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 变化的情况下,周期可提供对时钟时间的可靠预测。

          【讨论】:

            猜你喜欢
            • 2023-03-03
            • 2010-09-20
            • 1970-01-01
            • 2018-04-13
            • 2014-11-19
            • 1970-01-01
            • 2021-03-13
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多