Wykrywanie strefy czasowej telefonii

W przypadku urządzeń z systemem Android 11 lub starszym automatyczne wykrywanie strefy czasowej w AOSP opiera się na sygnałach z podsystemu telefonii. Ze względu na zależność od podsystemu telefonii automatyczne wykrywanie strefy czasowej w systemie Android 11 lub starszym jest ograniczone do urządzeń telefonicznych.

Gdy dostępne jest wykrywanie strefy czasowej telefonii, działa ono przy użyciu sygnałów Mobile Country Code (MCC) oraz Network Identity and Time Zone (NITZ) .

Na przykład urządzenie we Francji może identyfikować strefę czasową wyłącznie na podstawie MCK zgłoszonego przez pobliskie wieże komórkowe. Jest to możliwe, ponieważ wiadomo, że Francja używa jednej strefy czasowej.

Gdy kraj korzysta z wielu stref czasowych, samo MCK nie wystarcza do zidentyfikowania strefy czasowej. W przypadku tych krajów urządzenie wykorzystuje również sygnały NITZ do identyfikacji prawidłowej strefy czasowej. Działa to dobrze w wielu miejscach na świecie, ale wymaga, aby sygnały NITZ były zarówno dostępne, jak i prawidłowe, a zatem jest zależne od operatorów.

Wykrywanie strefy czasowej telefonii jest detektorem pasywnym . Działa przez cały czas, dlatego często pojawiają się sugestie dotyczące telefonii, nawet jeśli źródłem time_zone_detector nie jest obecnie telefonia.

Ograniczenie wykrywania strefy czasowej telefonii

Nawet przy dostępnych poprawnych sygnałach NITZ wykrywanie strefy czasowej telefonii nie zawsze działa dobrze w każdym kraju. Dzieje się tak, ponieważ NITZ zawiera tylko informacje o przesunięciu i czasie letnim, które nie zawsze wystarczają do jednoznacznej identyfikacji strefy czasowej.

Jest wiele miejsc na świecie, w których może wystąpić problem ze strefą czasową. Na przykład Denver Colorado i Phoenix Arizona w USA nie można odróżnić za pomocą sygnałów NITZ zimą, ale można to zrobić w innych porach roku. Tego rodzaju problem może wystąpić w każdej lokalizacji z podobnie nakładającymi się strefami czasowymi.

Poniższa tabela przedstawia przykładowe zachowanie urządzenia w zależności od pory roku dla Denver i Phoenix:

Lokalizacja i sezon Informacje z MCC lub NITZ Wykryta strefa czasowa i zachowanie
Denver, Colorado
Zima
Czas: 1 stycznia 2021 12:00:00
Kraj: USA
Przesunięcie: UTC-7, brak czasu letniego
Dwa identyfikatory stref pasują do siebie:
  • Ameryka/Denver
  • Ameryka/Feniks

Urządzenie jest prawidłowo ustawione na Ameryka/Denver.
Phoenix, Arizona
Zima
Czas: 1 stycznia 2021 12:00:00
Kraj: USA
Przesunięcie: UTC-7, brak czasu letniego
Dwa identyfikatory stref pasują do siebie:
  • Ameryka/Denver
  • Ameryka/Feniks

Urządzenie jest nieprawidłowo ustawione na Ameryka/Denver.
Denver, Colorado
Lato
Czas: 1 lipca 2021 12:00:00
Kraj: USA
Przesunięcie: UTC-6, czas letni
Jeden identyfikator strefy pasuje:
  • Ameryka/Denver

Urządzenie jest prawidłowo ustawione na Ameryka/Denver.
Phoenix, Arizona
Lato
Czas: 1 lipca 2021 12:00:00
Kraj: USA
Przesunięcie: UTC-7, brak czasu letniego
Jeden identyfikator strefy pasuje:
  • Ameryka/Feniks

Urządzenie jest prawidłowo ustawione na America/Phoenix.

Powyższe przykłady pokazują, że zimą urządzenia z Androidem w Denver lub Arizonie muszą wybrać jeden z dwóch pasujących identyfikatorów strefy czasowej, które mogą być nieprawidłowe dla niektórych urządzeń, ale nadal wyświetlają pozornie poprawny czas lokalny. Zegar urządzenia, kalendarze i inne aplikacje wyświetlają oczekiwany czas lokalny, nawet jeśli identyfikator strefy czasowej jest nieprawidłowy, ponieważ oba identyfikatory stref czasowych obliczają ten sam czas lokalny w zimie.

Jednak wiosną, gdy Denver przestrzega czasu letniego, a Phoenix nie, niektóre urządzenia mogą tymczasowo wyświetlać nieprawidłowy czas lokalny, jeśli są ustawione na niewłaściwy identyfikator strefy czasowej dla lokalizacji użytkownika. Jest to korygowane, gdy tylko urządzenie odbierze nowy sygnał NITZ (w szczególności taki, który zawiera informacje o przesunięciu „UTC-7, bez czasu letniego”), ale może to zająć trochę czasu i zależy od przewoźników.

W rezultacie kalendarze lub inne aplikacje, które przechowują lub przenoszą identyfikator strefy czasowej od zimy do wiosny, mogą wyświetlać i używać nieprawidłowego czasu lokalnego, dopóki odpowiednie aplikacje nie zaktualizują identyfikatora strefy czasowej.

Debugowanie i testowanie

W poniższej sekcji opisano polecenia powłoki służące do debugowania i testowania funkcji wykrywania strefy czasowej telefonii.

Konfiguracja środowiska testowego

Testerzy zazwyczaj używają środowiska testowego z testową lub symulowaną komórką telefoniczną, aby sprawdzić zachowanie wykrywania strefy czasowej telefonii. Komórka testowa może być używana do symulacji sieci z różnymi MCC i do wysyłania sygnałów NITZ do urządzeń, a następnie monitorowania ich efektów.

Aby urządzenie wykryło strefę czasową, informacje o sygnale NITZ muszą być poprawne, zgodne z MCC i zgodne z kopią urządzenia IANA TZDB (reguły strefy czasowej). Sygnały NITZ, które są niezgodne z MCC, powodują, że pochodzenie telefonii staje się niepewne.

Na przykład, jeśli MCC używane przez komórkę testową jest przeznaczone dla USA, sygnał NITZ musi zawierać informacje o „czasie uniwersalnym”, przesunięciu i czasie letnim, które są prawidłowe dla miejsca w USA.

Interakcja z usługą com.android.phone

Aby sprawdzić, czy urządzenie odbiera prawidłowe sugestie stref czasowych telefonii, użyj:

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

To zrzuca informacje telefoniczne, które można również znaleźć w raportach o błędach Androida. Na urządzeniach z wieloma kartami SIM dostępne są informacje dla każdego radia SIM.

Dzienniki stref czasowych pokazują sugestie, które proces telefonii wysłał do time_zone_detector oraz 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")]}