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

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

Если функция определения часового пояса телефонии доступна, она работает с использованием сигналов мобильного кода страны (MCC) и идентификатора сети и часового пояса (NITZ) .

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

Если в стране используется несколько часовых поясов, одного 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")]}