DIX周围的POSIXct时间?

时间:2009-09-08 18:22:44

标签: r dst date-arithmetic posixct

我想从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周围绝对时差的最佳方法是什么?通常我会通过将时间转换为字符串并单独处理它来处理这个问题,以便不应用DST。

5 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

感谢hobbs!我需要做更多的工作,但从日期插槽中减去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"

答案 3 :(得分:0)

如果您只想计算天数,可以使用trunc来计算日期:

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

答案 4 :(得分:0)

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

持续时间

持续时间衡量两个时刻之间发生的确切时间。如果在间隔中发生闰秒,闰年或夏令时(DST)的变化,这可能会产生与时钟时间相关的意外结果。

周期测量两个时刻之间发生的时钟时间的变化。在闰秒,闰年和夏令时变化的情况下,周期提供了对时钟时间的可靠预测。