2017-09-15 55 views
4

我審查了與#2時區的許多問題沒有得到更新,但我找不到一個的問題,我掙扎:爲什麼DateTimeZone.getDefault()時區在Android正在改變

  • 爲什麼Joda的DateTimeZone.getDefault()在TZ更改(在恢復應用程序之後?)時返回更新的時區? TimeZone.getDefault()似乎工作得很好
  • 我應該使用DateTimeZone.forTimeZone(TimeZone.getDefault())來獲得最新的Joda的DateTimeZone對象嗎?

這裏是如何複製:即打印既DateTimeZone.getDefault()TimeZone.getDefault()

  1. 開始應用:

09-15 16:46:59.512 14961-14961/COM .example.android.whatever D/TimeZone: DateTimeZone.getDefault()= Europe/London;TimeZone.getDefault()= libcore.util.ZoneInfo [ID = 「歐洲/倫敦」,...]

  • 進入設置 - >時區變化到太平洋夏令時。
  • 回到應用,打印的東西(例如,在的onResume()):
  • 8月9日至15日:49:24.727 14961-14961/com.example.android.whatever d /時區: DateTimeZone.getDefault()=歐洲/倫敦; TimeZone.getDefault()libcore.util.ZoneInfo [ID = 「美國/洛杉磯」,...]

  • 在這個階段I可以旋轉應用。 DateTimeZone.getDefault()將被卡住。
  • 只有在應用onRestart後 - 值纔會正確。
  • 這是爲什麼?

    回答

    3

    Joda-Time緩存默認時區。

    如果你運行這段代碼(在我的JVM,默認的時區爲America/Sao_Paulo):

    System.out.println("JVM default=" + TimeZone.getDefault().getID()); // America/Sao_Paulo 
    DateTimeZone t1 = DateTimeZone.getDefault(); 
    System.out.println("Joda Default=" + t1); // America/Sao_Paulo 
    
    // setting the default timezone to London 
    TimeZone.setDefault(TimeZone.getTimeZone("Europe/London")); 
    System.out.println("JVM default=" + TimeZone.getDefault().getID()); // Europe/London 
    DateTimeZone t2 = DateTimeZone.getDefault(); 
    System.out.println("Joda Default=" + t2); // America/Sao_Paulo 
    System.out.println(t1 == t2); // true 
    

    輸出將是:

    JVM默認=美洲/聖保羅
    喬達默認值= America/Sao_Paulo
    JVM default = Europe/London
    Joda Default = America/Sao_Paulo
    true

    另請注意,t1 == t2返回true,這意味着它們是完全相同的實例。

    要改變JVM的默認設置後喬達的默認時區,則必須將其設置在DateTimeZone太:

    // change Joda's default timezone to be the same as the JVM's 
    DateTimeZone.setDefault(DateTimeZone.forTimeZone(TimeZone.getDefault())); 
    DateTimeZone t3 = DateTimeZone.getDefault(); 
    System.out.println("Joda Default=" + t3); // Europe/London 
    System.out.println(t1 == t3); // false 
    

    此輸出:

    喬達默認設置爲歐洲/倫敦

    重新啓動一切後,緩存消失,Joda-Time獲取新的d首次調用時默認。

    3

    你不應該直接使用喬達時間,但更好地利用丹尼爾·盧的庫JodaTimeAndroid - 圍繞喬達時間瘦包裝),因爲

    • 加載TZ數據時,它具有更好的性能特點on Android
    • 它有一個合適的廣播接收器來跟蹤system timezone的變化。
    相關問題