2017-02-21 373 views
1

我想計算夏令時和非夏令時之間的時差。但我不知道如何讓R知道一段時間是否是夏令時。計算夏令時和非夏令時之間的時差

例如,鳳凰城在夏季不調整夏令時,而美國的大部分地區都是如此。如果我想計算下面的時差,它應該是3小時而不是2小時。 tzone =「America/Phoenix」會自動將時間設置爲「MST」,這是夏令時,但這不是我想要的。

library(lubridate) 
x <- "22/5/2016 23:50" 
x <- dmy_hm(x) 
x1 <- force_tz(x, tzone = "America/Phoenix") 
x2 <- force_tz(x, tzone = "EST") 

x1-x2 
# The output is "Time difference of 2 hours". But actually it is supposed to be 3 hours. 

我試着設置tzone =「EDT」或「MDT」來解決這個問題。但似乎R不允許識別這些時區。

> x2 <- force_tz(y, tzone = "EDT") 
Warning messages: 
1: In as.POSIXct.POSIXlt(lt) : unknown timezone 'EDT' 
2: In as.POSIXlt.POSIXct(ct) : unknown timezone 'EDT' 
> x3 <- force_tz(y, tzone = "MDT") 
Warning messages: 
1: In as.POSIXlt.POSIXct(x, tz) : unknown timezone 'EDT' 
2: In as.POSIXct.POSIXlt(lt) : unknown timezone 'MDT' 
3: In as.POSIXlt.POSIXct(ct) : unknown timezone 'MDT' 
+0

* *夏天* *不是冬天* * 3 *小時。看到我的答案。 –

+0

謝謝,德克!你的代碼有效。但我的代碼中的意思是夏天。我把月份放在月份前面。爲了澄清它,我將原始日期修改爲22/5/2016 – Bin

+0

啊。這是一種常見的日期格式,但很容易出錯(至少在世界的這一部分)。最好堅持2016-05-22。 –

回答

3

你有因爲EST問題。從?timezone

要小心,有些名稱可能不是你所期望的:在 特別EST在加拿大沒有使用夏令時 一個時區...

使用US/EasternAmerica/New_York而不是EST。有關更多信息,請參閱?OlsonNames()

#DST 
x1 = as.POSIXct("22/5/2016 23:50", format = "%d/%m/%Y %H:%M", tz = "America/New_York") 
x2 = as.POSIXct("22/5/2016 23:50", format = "%d/%m/%Y %H:%M", tz = "America/Phoenix") 
x2 - x1 
#Time difference of 3 hours 

#NOT DST 
x1 = as.POSIXct("22/12/2016 23:50", format = "%d/%m/%Y %H:%M", tz = "America/New_York") 
x2 = as.POSIXct("22/12/2016 23:50", format = "%d/%m/%Y %H:%M", tz = "America/Phoenix") 
x2 - x1 
#Time difference of 2 hours 
+2

正確的答案和良好的基礎R解決方案。 Upvoting ... –

0

MST和EST中的「S」代表「標準」。這總是非夏令時版本。你想在東部夏令時使用EDT。

+0

但R不識別「EDT」等時區。也許是「EST5EDT」 – Bin

+1

。 「東部時間」因澳大利亞人擁有自己的「東部」地帶而出名。(和「美國人」在他們的假設中是有名的。) –

2

這是一種方法。我用anytime()爲了方便(從anytime包)

R> nyc <- format(anytime("12/05/2016 23:50", tz="America/New_York")) 
R> phx <- format(anytime("12/05/2016 23:50", tz="America/Phoenix")) 
R> diff(anytime(c(phx, nyc))) 
Time difference of 2 hours 
R> 

你必須去通過明確的文字表述(這是一種浪費)作爲底層的表示總是在UTC:

R> difftime(anytime("12/05/2016 23:50", tz="America/New_York"), 
+   anytime("12/05/2016 23:50", tz="America/Phoenix")) 
Time difference of 0 secs 
R> 

所需/懷疑三個小時的差異只發生在夏季。使用七月代替十二月:

R> phx <- format(anytime("07/05/2016 23:50", tz="America/Phoenix")) 
R> nyc <- format(anytime("07/05/2016 23:50", tz="America/New_York")) 
R> diff(anytime(c(phx, nyc))) 
Time difference of 3 hours 
R> 

和當然,所有這一切都在這裏與anytime()做可以與基礎R函數來完成。這只是一條捷徑,而這一切都歸結於POSIXt如何處理這一點。

編輯:我忘了,我在另一個包裝的另一個幫手:

R> RcppCCTZ::tzDiff("America/Phoenix", "America/New_York", anytime("2016-05-22")) 
[1] 3 
R>