2009-11-11 36 views
13

我使用Joda time(1.6)庫和它保持返回datetime對象與錯誤的時區,英國夏令時間,而不是GMT。約達時間給出了錯誤的時區

我的Windows工作站(運行JDK 1.6.0_16)認爲這是在格林尼治標準時間,如果我從JDK日期/時間類得到默認的時區是正確的(GMT)。我在我們的Linux服務器上也獲得了相同的行爲。我認爲這可能是Joda的時區數據庫文件中的錯誤,因此我使用最新的數據庫重建了該jar,但沒有任何更改。

import java.util.TimeZone; 
import org.joda.time.DateTime; 
import org.joda.time.DateTimeZone; 
import org.joda.time.LocalTime; 
import org.joda.time.format.DateTimeFormatter; 
import org.joda.time.format.ISODateTimeFormat; 

public class TimeZoneTest { 

    public static void main(String[] args) {     
     DateTimeFormatter timeParser = ISODateTimeFormat.timeParser(); 
     TimeZone timeZone = TimeZone.getDefault(); 
     System.out.println(timeZone.getID()); // "Europe/London" 
     System.out.println(timeZone.getDisplayName()); // "Greenwich Mean Time" 

     DateTimeZone defaultTimeZone = DateTimeZone.getDefault(); 
     System.out.println(defaultTimeZone.getID()); //"Europe/London" 
     System.out.println(defaultTimeZone.getName(0L)); //"British Summer Time" 

     DateTime currentTime = new DateTime(); 
     DateTimeZone currentZone = currentTime.getZone(); 
     System.out.println(currentZone.getID()); //"Europe/London" 
     System.out.println(currentZone.getName(0L)); //"British Summer Time"    
    } 
} 

調試通過靜態初始化器在org.joda.time.DateTimeZone我看到System.getProperty("user.timezone")調用提供"Europe/London"預期。

+0

擴大答案提供現實問題的解釋 – jitter 2009-11-11 10:56:20

回答

30

好了,去的這一點,你有什麼英國夏令時間實際上意味着熟悉的根源,當它在的地方。爲了讓你短傳0LgetName()這是1970-01-01T00:00:00Z所以DefaultTimeZone擡頭的那一刻時區的名稱。這是英國的夏季時間。

來源:http://www.nmm.ac.uk/explore/astronomy-and-time/time-facts/british-summer-time

在1968年鐘錶是2月18日前進一個小時 比格林尼治和 一直保持到英國標準 時間,在此期間,時鐘被關在全年 提前GMT的,走進 力1968年10月和10月31日1971年

之間27

如果改爲將通過以毫秒爲單位正弦適量e 1970-01-01T00:00:00Z。例如通過做

defaultTimeZone.getName(new GregorianCalendar().getTimeInMillis()) 

你也會得到正確的字符串。基本上,你只是喂getName()方法錯誤的參數,從而結束了意想不到的結果。

如果你想詳細檢查檢查喬達源org/joda/time/tz/src文件,看看喬達如何確定時區。


而不是

defaultTimeZone.getName(0L) 

你可以使用

defaultTimeZone.toTimeZone().getDisplayName() 

這確實對我來說。

+6

太棒了。誰會想到。我真的會說:「1970年1月1日沒有辦法在英國夏令時」。更傻了我。 這也解釋了導致使用ISODateTimeFormat.timeParser()解析「10:00:00.0000000 + 00:00」的問題導致GMT + 1中的日期時間的根本問題。這是因爲喬達沒有獨立的時間和日期概念,所以這次解析時間相對於1970年1月1日,正如你指出的那樣,是GMT + 1!瘋。謝謝。 – matthewKizoom 2009-11-11 11:07:09

+0

+1是相關的,也有一點歷史課程 – I82Much 2009-11-11 13:24:34

0

可能感興趣的你看到的DateTimeZone類的靜態初始化器在1.6:

static { 
    setProvider0(null); 
    setNameProvider0(null); 

    try { 
     try { 
      cDefault = forID(System.getProperty("user.timezone")); 
     } catch (RuntimeException ex) { 
      // ignored 
     } 
     if (cDefault == null) { 
      cDefault = forTimeZone(TimeZone.getDefault()); 
     } 
    } catch (IllegalArgumentException ex) { 
     // ignored 
    } 

    if (cDefault == null) { 
     cDefault = UTC; 
    } 
} 

我的猜測是,你有一個user.timezone屬性定義(並設置爲BST)。否則,看起來Joda應該根據JDK時區創建自己的時區實例;我希望這個領域的任何錯誤,尤其是轉換GMT時區,現在都會被提起。

+0

user.timezone給「歐洲/倫敦」(我已經添加到了這個問題)。 – matthewKizoom 2009-11-11 10:43:49