我想从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。
答案 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)的变化,这可能会产生与时钟时间相关的意外结果。
期
周期测量两个时刻之间发生的时钟时间的变化。在闰秒,闰年和夏令时变化的情况下,周期提供了对时钟时间的可靠预测。