Wykrywanie strefy czasowej w telefonach

Na urządzeniach z Androidem 11 lub starszym automatyczne wykrywanie strefy czasowej AOSP wykorzystuje sygnały z podsystemu telefonicznego. Ze względu na zależność w podsystemie telefonicznym, automatyczne wykrywanie strefy czasowej na Androidzie 11 lub starszym jest ograniczona do urządzeń telefonicznych.

Jeśli wykrywanie strefy czasowej telefonu jest dostępne, działa ono przy użyciu Kod kraju urządzenia mobilnego (MCK) oraz Tożsamość sieci i strefa czasowa (NITZ) sygnałów.

Na przykład urządzenie we Francji może określić strefę czasową tylko na podstawie MCK zgłaszane przez pobliskie stacje bazowe. To możliwe, ponieważ Francja jest znana użyć jednej strefy czasowej.

Jeśli w danym kraju obowiązuje kilka stref czasowych, samo konto MCK nie wystarczy, strefę czasową. W tych krajach urządzenie wykorzystuje też sygnały NITZ do: poprawne ustawienie strefy czasowej. Ten system sprawdza się w wielu miejscach na świecie Wymaga to jednak, aby sygnały NITZ były zarówno dostępne, jak i prawidłowe, w związku z tym zależą od operatorów.

Wykrywanie strefy czasowej w telefonach jest pasywnym detektorem. Działa cały czas, dlatego sugestie dotyczące połączeń telefonicznych są często generowane, nawet jeśli Algorytm time_zone_detector nie obsługuje obecnie połączeń telefonicznych.

Ograniczenie wykrywania strefy czasowej w telefonach

Nawet jeśli dostępne są prawidłowe sygnały NITZ, wykrywanie strefy czasowej w telefonii nie jest możliwe w każdym kraju. Dzieje się tak, ponieważ NITZ zawiera tylko przesunięcie i zmiany czasu na letni lub zimowy, które nie zawsze wystarczają do jednoznacznego określenia strefie czasowej.

Ten problem ze strefą czasową może występować w wielu miejscach na świecie. Na przykład Denver Colorado i Phoenix w stanie Arizona w USA nie mogą być do rozróżniania na podstawie sygnałów NITZ zimą, ale można je też stosować w innych porach roku. W lokalizacjach z podobnie nakładającymi się strefami czasowymi może występować ten rodzaj Google Cloud.

W tabeli poniżej znajdziesz zestawienie zachowań urządzeń w zależności od pory roku. dla Denver i Phoenix.

Lokalizacja i pora roku Informacje z MCK lub NITZ Wykryta strefa czasowa i zachowanie
Denver, Kolorado
Zima
Godzina: 1 stycznia 2021 r., godz. 12:00:00
Kraj: US
Przesunięcie: UTC-7, bez zmiany czasu
Pasujące identyfikatory 2 stref:
  • Ameryka/Denver
  • Ameryka/Phoenix
.
Urządzenie jest prawidłowo ustawione na Ameryka/Denver.
Phoenix, Arizona
Zima
Godzina: 1 stycznia 2021 r., godz. 12:00:00
Kraj: US
Przesunięcie: UTC-7, bez zmiany czasu
Pasujące identyfikatory 2 stref:
  • Ameryka/Denver
  • Ameryka/Phoenix
.
Urządzenie jest nieprawidłowo ustawione na Ameryka/Denver.
Denver, Kolorado
Lato
Godzina: 1 lipca 2021 r., godz. 12:00:00
Kraj: US
Przesunięcie: UTC-6, czas letni
Jeden identyfikator strefy pasuje do:
  • Ameryka/Denver
.
Urządzenie jest prawidłowo ustawione na Ameryka/Denver.
Phoenix, Arizona
Lato
Godzina: 1 lipca 2021 r., godz. 12:00:00
Kraj: US
Przesunięcie: UTC-7, bez zmiany czasu
Jeden identyfikator strefy pasuje do:
  • Ameryka/Phoenix
.
Urządzenie jest prawidłowo ustawione na America/Phoenix.

Powyższe przykłady pokazują, że zimą urządzenia z Androidem w Denver i Arizona musi wybrać jeden z dwóch pasujących identyfikatorów strefy czasowej, który może być nieprawidłowy w przypadku niektórych urządzeń, ale nadal będzie wyświetlać prawdopodobnie prawidłowy czas lokalny. Urządzenie zegar, kalendarze i inne aplikacje wyświetlają oczekiwany czas lokalny, nawet jeśli identyfikator strefy czasowej jest nieprawidłowy, ponieważ oba identyfikatory stref czasowych wyliczają tę samą lokalną wartość podczas zimy.

Jednak wiosną, gdy w Denver występuje czas letni, a w Phoenix nie. Niektóre urządzenia mogą tymczasowo wyświetlać nieprawidłowy czas lokalny, jeśli są ustawiony. z nieprawidłowym identyfikatorem strefy czasowej dla lokalizacji użytkownika. Poprawimy to jak najszybciej gdy urządzenie odbiera nowy sygnał NITZ (konkretnie „UTC-7, bez zmiany czasu” informacje o przesunięciu), ale może to zająć trochę czasu i zależy od operatorów.

W związku z tym kalendarze lub inne aplikacje, które przechowują lub przenoszą identyfikator strefy czasowej okres od zimy do wiosny może być wyświetlany z nieprawidłowym czasem lokalnym do odpowiednie aplikacje aktualizują identyfikator strefy czasowej.

Debugowanie i testowanie

W tej sekcji opisano polecenia powłoki służące do debugowania i testowania funkcji wykrywania strefy czasowej w telefonach.

Konfiguracja środowiska testowego

Testerzy zwykle używają środowiska testowego z testową lub symulowaną siecią telefoniczną. aby sprawdzić działanie wykrywania strefy czasowej w telefonach. Komórka testowa może być używana do: symulować sieci z różnymi MCK oraz wysyłać sygnały NITZ do urządzeń a potem monitorować ich efekty.

Aby urządzenie mogło wykryć strefę czasową, informacje o sygnale NITZ muszą być prawidłowe, zgodne z MCK i zgodne z kopią urządzenia w IANA TZDB. (reguły strefy czasowej). Sygnały NITZ, które są niezgodne z MCK, powodują algorytmu telefonii, aby nie był pewny.

Jeśli na przykład MCK używane przez komórkę testową dotyczy Stanów Zjednoczonych, sygnał NITZ musi zawierać „czas uniwersalny”, informacje o przesunięciu i zmiany czasu letniego, które jest właściwe dla lokalizacji w USA.

Korzystanie z usługi com.android.phone

Aby sprawdzić, czy urządzenie otrzymuje prawidłowe sugestie dotyczące strefy czasowej telefonii, użyj:

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

Powoduje to zapisywanie informacji o telefonach, które można również znaleźć w artykule o błędzie z Androidem. raportów. Na urządzeniach z wieloma kartami SIM dostępne są informacje o każdym radio na karcie SIM.

W sekcji Dzienniki strefy czasowej znajdziesz sugestie, do których zostały wysłane połączenia telefoniczne. time_zone_detector i powody wysłania sugestii.

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")]}