2014-10-27 44 views
1

問題描述:將「2014-11-02 01:00:15 EST」轉換爲GMT。Java從EDT到EST的時區過渡期

這似乎很容易。但爲什麼下面的代碼給出了錯誤的答案?

背景:

  • EDT又名GMT-4
  • EST又名GMT-5
  • 2014年11月2日1點○○分15秒EST == 2014年11月2日06:00: 15 GMT
  • 如果我用戶註釋掉日期字符串它的作品!
  • EDT(直到2014年11月2日凌晨2點) - >在凌晨2點,我們去到美國東部時間凌晨1點

代碼示例:

ZoneId gmt = ZoneId.of("GMT"); 
//String from = "2014-11-02 01:00:15 GMT-05:00"; 
String from = "2014-11-02 01:00:15 EST"; 

final DateTimeFormatter dateTimeFormatterone = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss z"); 
ZnedDateTime zonedDateTime = ZonedDateTime.parse(from, dateTimeFormatterone); 
ZonedDateTime gmtzonedDateTime = zonedDateTime.withZoneSameInstant(gmt); 
String result = gmtzonedDateTime.format(dateTimeFormatterone); 

這就是結局是什麼。

result == "2014-11-02 05:00:15 GMT" 

它不應該是 結果== 「2014年11月2日6時00分15秒GMT」

任何幫助將是巨大的。我認爲這是Java中的一個錯誤。但我也認爲我在某個地方犯了一個錯誤。

感謝 保羅

+1

我相信你有它倒退。 EDT是GMT-4,EST是GMT-5。這意味着輸出(05:00:15 GMT)是正確的。 – VGR 2014-10-27 21:23:56

+0

你說得對。我更新了這個例子。如果你有機會看看我更新的例子。 – user2337757 2014-10-27 23:28:33

+0

這很棘手,也許是啓發式的,因爲即使在EDT處於活動狀態時,也可以始終將時間指定爲EST。這意味着01:00:15(以及從凌晨1點到凌晨2點的整個小時)在當晚的EST中連續發生兩次。所以當Java解析日期時,解析器應該假設該小時的第一次出現,還是第二次出現? – VGR 2014-10-28 16:13:00

回答

0

給定的GMT偏移的縮寫,是沒有:。更改

String from = "2014-11-02 01:00:15 GMT-05:00"; 

String from = "2014-11-02 01:00:15 GMT-0500"; 

和一些邏輯上的錯誤:

如果從2到1在2014年11月2日凌晨2點,是不是正確的,從6轉至5以及5點是正確的?

+0

這是「2014-11-02 01:00:15 GMT-05:00」返回「2014-11-02 06:00:15 GMT」的正確GMT值。這個「2014-11-02 01:00:15 EST」返回「2014-11-02 05:00:15 GMT」。不知道爲什麼會發生這種情況,因爲這個「2014-11-02 01:00:15 GMT-05:00」和這個「2014-11-02 01:00:15 EST」應該是平等的。現在如果你輸入「2014-11-02 02:00:00 GMT-05:00」或「2014-11-02 02:00:00 EST」,你會得到「2014-11-02 07: 00:00 GMT「。只是在你從美國東部時間凌晨2點到美國東部時間凌晨1點的那個窗口中,我看到這個問題 – user2337757 2014-10-27 23:56:10

+0

是的,但是讓我們假設我們沒有DST。然後「2014-11-02 06:00:15」格林威治標準時間是正確的。現在,在11月2日凌晨1點,我們把時鐘放回了一個小時,而在這段時間的所有時間裏我們都減少了一個小時。因此:「2014-11-02 05:00:15 GMT」 – 2014-10-28 09:21:26