2009-09-08 79 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變化的情況下,週期提供時鐘時間的強大預測。