3

我想从 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。

4

5 回答 5

2

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

于 2009-09-13T01:57:31.150 回答
1

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

于 2009-09-08T19:49:24.427 回答
1

谢谢霍布斯!我需要做更多的工作,但在 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"
于 2009-09-16T02:14:05.743 回答
0

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

> trunc(Sys.time(), "day") + 86400
[1] "2009-09-13 PDT"
> trunc(Sys.time(), "day") - 86400
[1] "2009-09-11 PDT"
于 2009-09-13T01:44:56.043 回答
0

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

持续时间

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

时期

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

于 2014-02-13T12:50:46.293 回答