我复习了许多与StackOverflow上的TimeZones相关的问题,但是找不到我所遇到的问题之一:

  • 为什么Joda的DateTimeZone.getDefault()不会在TZ更改时返回更新的时区(恢复应用程序后?)。 TimeZone.getDefault()似乎可以正常工作
  • 我应该使用DateTimeZone.forTimeZone(TimeZone.getDefault())来获取最新的Joda的DateTimeZone对象吗?

  • 以下是复制方法:
  • 启动同时打印DateTimeZone.getDefault()TimeZone.getDefault()的应用程序:

  • 09-15 16:46:59.512 14961-14961 / com.example.android.whatever D / TimeZone:
    DateTimeZone.getDefault()=欧洲/伦敦; TimeZone.getDefault()= libcore.util.ZoneInfo [id =“Europe / London” ,...]
  • 转到设置->将时区更改为PDT。
  • 返回打印内容的应用程序(例如,在onResume()中):

  • 09-15 08:49:24.727 14961-14961 / com.example.android.whatever
    D / TimeZone: DateTimeZone.getDefault()=欧洲/伦敦;
    TimeZone.getDefault()libcore.util.ZoneInfo [id =“America / Los_Angeles” ,...]
  • 在此阶段,我可以旋转应用程序。 DateTimeZone.getDefault()将被卡住。
  • 仅在应用程序onRestart之后-该值将正确。

  • 为什么会这样呢?

    最佳答案

    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
    Joda默认=美国/ Sao_Paulo
    JVM默认=欧洲/伦敦
    Joda默认=美国/ Sao_Paulo
    真正

    还要注意t1 == t2返回true,这意味着它们是完全相同的实例。

    要在更改JVM默认值后设置Joda的默认时区,也必须在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默认值=欧洲/伦敦


    重新启动所有内容后,缓存消失,Joda-Time在首次调用时将获得新的默认值。

    10-06 14:44