Почему DateTimeZone.getDefault () не обновляется при изменении зоны в Android

Я рассмотрел много вопросов, связанных с часовыми поясами, в Stackoverflow, но не смог найти ответ на проблему, с которой борюсь:

  • Почему не Joda DateTimeZone.getDefault () возвращает обновленный часовой пояс при изменении TZ (после возобновления работы приложения?). TimeZone.getDefault () , похоже, работает нормально .
  • Следует ли мне использовать DateTimeZone.forTimeZone (TimeZone.getDefault ()) , чтобы обновить объект Joda DateTimeZone ?

Вот как для репликации:

  1. Запустите приложение, которое печатает как 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» , …]

  1. Перейдите в настройки -> измените часовой пояс на PDT.
  2. Вернитесь в приложение, которое печатает материал (например, в 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» , …]

  1. На этом этапе я могу вращать приложение . DateTimeZone.getDefault () зависнет.
  2. Только после приложения onRestart — значение будет правильным.

Почему это так?


Joda-Time кэширует часовой пояс по умолчанию.

Если вы запустите этот код (в моей JVM по умолчанию часовой пояс: America/Sao_Paulo ):

  System.out.println ("JVM default =" + TimeZone.getDefault (). getID (  )); //Америка/Sao_PauloDateTimeZone t1 = DateTimeZone.getDefault (); System.out.println ("Joda Default =" + t1); //America/Sao_Paulo//установка часового пояса по умолчанию на LondonTimeZone.setDefault (TimeZone.getTimeZone ("Europe/London")); System.out.println ("JVM default =" + TimeZone.getDefault (). GetID ())  ; //Europe/LondonDateTimeZone t2 = DateTimeZone.getDefault (); System.out.println ("Joda Default =" + t2); //Америка/Sao_PauloSystem.out.println (t1 == t2); //true  

Результатом будет:

JVM default = America/Sao_Paulo
Joda Default = America /Sao_Paulo
JVM default = Europe/London
Joda Default = America/Sao_Paulo
true

Также обратите внимание, что t1 == t2 возвращает true , что означает, что они являются одним и тем же экземпляром.

Чтобы установить часовой пояс Joda по умолчанию после изменения значения по умолчанию JVM, вы также должны установить его в DateTimeZone :

 //измените часовой пояс Joda по умолчанию на такой же, как в JVM'sDateTimeZone.setDefault (DateTimeZone  .forTimeZone (TimeZone.getDefault ())); DateTimeZone t3 = DateTimeZone. getDefault (); System.out.println ("Joda Default =" + t3); //Европа/LondonSystem.out.println (t1 == t3); //false  

Это выводит:

Joda Default = Europe/London
false

После перезапуска всего кеш исчезает, и Joda-Time получает новое значение по умолчанию при первом вызове.


3

Вы не должны напрямую использовать Joda-Time, но лучше использовать библиотеку Дэниела Лью (JodaTimeAndroid — тонкий оболочку Joda-Time), потому что

  • он имеет лучшие характеристики производительности при загрузке tz-данных на Android.
  • у него есть подходящий широковещательный приемник для отслеживать изменения часового пояса системы.
Улучшить этот ответ
ответил 15 сентября ’17 в 16:43
добавить комментарий |

Вам не следует напрямую использовать Joda-Time, но лучше использовать библиотеку Дэниела Лью (JodaTimeAndroid — тонкая оболочка вокруг Joda-Time), потому что

  • он имеет лучшие характеристики производительности при загрузке tz-данных на Android.
  • он имеет подходящую широковещательную- приемник для отслеживания изменений системного часового пояса.


Устранение неполадок в приложении Mobile Zone | Семейная зона

Устранение неполадок в мобильной зоне для iOS

Активация Приложение Mobile Zone

Нажмите следующую ссылку, чтобы получить инструкции по активации приложения Mobile Zone

Safari не открывается после активации приложения Mobile Zone

После ввода ключа активации, выбора члена семьи и нажатия кнопки активации ничего не происходит

  • Открыть настройки на устройстве iOS
  • Меню: Настройки> Общие
  • Меню: Общие> Ограничения
  • Проверить, не отключен ли Safari в рамках ограничений устройства.

  • Открыть настройки на устройстве iOS
  • Меню: Настройки> Safari
  • Выберите: перейти в нижнюю часть меню.
  • Убедитесь, что включен JavaScript

Профиль Insta llation Failed — Управление мобильными устройствами уже установлено.

Возникнет эта ошибка если на устройстве iOS уже установлен профиль MDM. Apple разрешает установку только одного профиля MDM на устройство iOS.. Если на этом устройстве установлен профиль управления школой , не удаляйте его.

  • Откройте настройки на Устройство iOS
  • Меню: Настройки> Общие
  • Выберите: Управление устройством
  • Удалить существующий профиль MDM

Ошибка установки профиля — новые полезные данные MDM не соответствуют старым.

Эта ошибка возникает, если на устройстве iOS уже существует профиль MDM мобильной зоны.

  • Открыть Настройка на устройстве iOS
  • Меню: Настройки> Общие
  • Выберите: Управление устройством> Семейная зона
  • Выберите: Удалить управление
  • Активировать приложение Mobile Zone

Устранение неполадок Mobile Zone для Android

Активация приложения Mobile Zone

Нажмите по следующей ссылке приведены инструкции по активации приложения Mobile Zone

Разрешение VPN запрашивается после каждой перезагрузки

В версиях Android (4.0.3–4.4) каждый раз при перезагрузке телефона необходимо повторно предоставлять все разрешения VPN. Это особенность более ранних версий операционной системы Android. Таким образом, после каждой перезагрузки необходимо будет повторно предоставлять разрешения VPN для Семейной зоны. Обновление до более поздней версии Android решит эту проблему.

Невозможно удалить Приложение Mobile Zone на Android.

Открыть: меню настроек устройств
Меню: Безопасность> Другие настройки безопасности
Выберите: Администраторы устройства
Выключите: Семейная зона
Удалить приложение Семейной зоны

Оцените статью
logicle.ru
Добавить комментарий