2009-09-08 56 views
3

我想从POSIX日期中减去1天,并在DST的同时结束。DST附近的POSIXct时间?

例如,当我加了一天:

> 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。

回答

2

你的代码是做什么你问它做的,因为你没有要求它增加或减少一天,你要求它增加或减去24小时。 24小时(86400秒)前2009-03-08 23:00:00 EDT2009-03-07 22:00:00 EST。我不熟悉R库,但我熟悉它们包装的POSIX函数。如果您购买POSIXct,请将其day财产减1,然后通过POSIXlt将其“重新投”到POSIXct(以确保例如2月-1日成为1月31日),那么您应该能够可靠地扣除一天。

1

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

+0

如果我转换为UTC,减去一天,然后转换回来,我将以相同的偏移结束,因为DST仍然应用于转换。对? – Shane 2009-09-09 13:15:32

+0

如果在DST的第一天,那么取决于活动日期,否则是否。 但是将所有日期时间视为UTC,并且仅在最后时刻格式化为当地时间 – Mark 2009-09-09 16:52:30

0

如果你只是想数着日子,你可以使用trunc以正义之举的日子:

> trunc(Sys.time(), "day") + 86400 
[1] "2009-09-13 PDT" 
> trunc(Sys.time(), "day") - 86400 
[1] "2009-09-11 PDT" 
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" 
0

lubridate规定,规定什么是基本包有些不清楚两个额外的时间跨度类。从Tha手册:

持续时间

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

期间

期间测量在两个时刻之间发生的时间变化。在闰秒,闰年和DST变化的情况下,周期提供时钟时间的强大预测。