Обнаружение часового пояса телефонии

Для устройств под управлением Android 11 или более ранней версии автоматическое определение часового пояса в AOSP зависит от сигналов подсистемы телефонии. Из-за зависимости от подсистемы телефонии автоматическое определение часового пояса на Android 11 или более ранней версии ограничено телефонными устройствами.

Когда доступно определение часового пояса телефонии, оно работает с использованием сигналов Mobile Country Code (MCC) и Network Identity and Time Zone (NITZ) .

Например, устройство во Франции может определить часовой пояс исключительно на основе MCC, о котором сообщают близлежащие вышки сотовой связи. Это возможно, потому что известно, что во Франции используется единый часовой пояс.

Если в стране используется несколько часовых поясов, одного Центра клиентов недостаточно для определения часового пояса. Для этих стран устройство также использует сигналы NITZ для определения правильного часового пояса. Это хорошо работает во многих местах по всему миру, но требует, чтобы сигналы NITZ были доступны и правильны, и поэтому он зависит от операторов связи.

Определение часового пояса телефонии является пассивным детектором. Он работает постоянно, поэтому предложения телефонии часто делаются, даже если time_zone_detector в настоящее время не является телефонией.

Ограничение определения часового пояса телефонии

Даже при наличии правильных сигналов NITZ определение часового пояса телефонии не всегда хорошо работает в каждой стране. Это связано с тем, что NITZ содержит только информацию о смещении и переходе на летнее время, которых не всегда достаточно для однозначной идентификации часового пояса.

В мире есть много мест, где может возникнуть проблема с часовым поясом. Например, Денвер, штат Колорадо, и Феникс, штат Аризона, в США нельзя различить с помощью сигналов NITZ зимой, но можно в другие сезоны. Любое местоположение с аналогичным перекрытием часовых поясов может столкнуться с такой проблемой.

В следующей таблице показано поведение устройства в зависимости от сезона для Денвера и Феникса, например:

Местоположение и сезон Информация от MCC или NITZ Обнаруженный часовой пояс и поведение
Денвер, Колорадо
Зима
Время: 1 января 2021 г., 12:00:00
Страна: США
Смещение: UTC-7, без перехода на летнее время
Два идентификатора зоны совпадают:
  • Америка/Денвер
  • Америка/Феникс

Устройство правильно настроено на Америку/Денвер.
Феникс, Аризона
Зима
Время: 1 января 2021 г., 12:00:00
Страна: США
Смещение: UTC-7, без перехода на летнее время
Два идентификатора зоны совпадают:
  • Америка/Денвер
  • Америка/Феникс

Устройство неправильно настроено на Америку/Денвер.
Денвер, Колорадо
Лето
Время: 1 июля 2021 г., 12:00:00
Страна: США
Смещение: UTC-6, летнее время
Идентификатор одной зоны соответствует:
  • Америка/Денвер

Устройство правильно настроено на Америку/Денвер.
Феникс, Аризона
Лето
Время: 1 июля 2021 г., 12:00:00
Страна: США
Смещение: UTC-7, без перехода на летнее время
Идентификатор одной зоны соответствует:
  • Америка/Феникс

Устройство правильно настроено на Америку/Феникс.

Приведенные выше примеры показывают, что зимой Android-устройства в Денвере или Аризоне должны выбрать один из двух совпадающих идентификаторов часовых поясов, которые могут быть неверными для некоторых устройств, но по-прежнему отображают правильное местное время. Часы устройства, календари и другие приложения отображают ожидаемое местное время, даже если идентификатор часового пояса неверен, поскольку оба идентификатора часового пояса рассчитывают одно и то же местное время зимой.

Однако весной, когда в Денвере действует переход на летнее время, а в Фениксе — нет, некоторые устройства могут временно показывать неверное местное время, если для них установлен неверный идентификатор часового пояса для местоположения пользователя. Это исправляется, как только устройство получает новый сигнал NITZ (в частности, тот, который содержит информацию о смещении «UTC-7, без перехода на летнее время»), но это может занять некоторое время и зависит от операторов связи.

В результате календари или другие приложения, которые хранят или переносят идентификатор часового пояса с зимы на весну, могут отображать и использовать неправильное местное время, пока соответствующие приложения не обновят идентификатор часового пояса.

Отладка и тестирование

В следующем разделе описаны команды оболочки для отладки и тестирования функции определения часового пояса телефонии.

Настройка тестовой среды

Тестировщики обычно используют тестовую среду с тестовой или смоделированной ячейкой телефонии для проверки поведения определения часового пояса телефонии. Тестовую ячейку можно использовать для имитации сетей с различными MCC и для отправки сигналов NITZ на устройства, а затем для мониторинга их эффектов.

Чтобы устройство могло определить часовой пояс, информация о сигнале NITZ должна быть правильной, соответствовать MCC и соответствовать копии устройства IANA TZDB (правила часового пояса). Сигналы NITZ, несовместимые с MCC, приводят к тому, что источник телефонии становится неопределенным.

Например, если MCC, используемый тестовой ячейкой, предназначен для США, сигнал NITZ должен содержать информацию о «универсальном времени», смещении и переходе на летнее время, которая является правильной для какой-либо части США.

Взаимодействие с сервисом com.android.phone

Чтобы убедиться, что устройство получает правильные предложения часового пояса для телефонии, используйте:

adb shell dumpsys activity service \
    com.android.phone/com.android.phone.TelephonyDebugService

Это выводит информацию о телефонии, которую также можно найти в отчетах об ошибках Android. На устройствах с несколькими SIM-картами есть информация для каждой SIM-радиостанции.

Журналы часовых поясов показывают предложения, которые процесс телефонии отправил в time_zone_detector, и причины отправки предложений.

TimeServiceHelperImpl:
          SystemClock.elapsedRealtime()=11864061
          System.currentTimeMillis()=1620652067178
          Time Logs:
...

Time zone Logs:
    18602 / 2021-05-10T09:50:21.718Z - Suggesting time zone update:
    TelephonyTimeZoneSuggestion{mSlotIndex=0, mZoneId='null', mMatchType=0, mQuality=0,
    mDebugInfo=[getTimeZoneSuggestion: nitzSignal=TimestampedValue{mReferenceTimeMillis=14098,
    mValue=NitzData{mOriginalString=21/05/10,09:50:18+04,01, mZoneOffset=3600000,
    mDstOffset=3600000, mCurrentTimeMillis=1620640218000, mEmulatorHostTimeZone=null}},
    countryIsoCode=null, Detection
    reason=handleNitzReceived(TimestampedValue{mReferenceTimeMillis=14098,
    mValue=NitzData{mOriginalString=21/05/10,09:50:18+04,01, mZoneOffset=3600000,
    mDstOffset=3600000, mCurrentTimeMillis=1620640218000, mEmulatorHostTimeZone=null}})]}
    18831 / 2021-05-10T09:50:21.948Z - Suggesting time zone update:
    TelephonyTimeZoneSuggestion{mSlotIndex=0, mZoneId='Europe/London', mMatchType=3, mQuality=1,
    mDebugInfo=[findTimeZoneFromCountryAndNitz: countryIsoCode=gb,
    nitzSignal=TimestampedValue{mReferenceTimeMillis=14098,
    mValue=NitzData{mOriginalString=21/05/10,09:50:18+04,01, mZoneOffset=3600000,
    mDstOffset=3600000, mCurrentTimeMillis=1620640218000, mEmulatorHostTimeZone=null}},
    findTimeZoneFromCountryAndNitz: lookupResult=OffsetResult{mTimeZone(ID)=Europe/London,
    mIsOnlyMatch=true}, Detection reason=handleCountryDetected("gb")]}