Auf Geräten mit Android 11 oder niedriger basiert die automatische Zeitzonenerkennung im Open-Source-Projekt für Android (AOSP) auf Signalen des Telefoniesubsystems. Aufgrund der Abhängigkeit vom Telefoniesubsystem ist die automatische Zeitzonenerkennung unter Android 11 oder niedriger auf Telefoniegeräte beschränkt.
Wenn die Zeitzonenerkennung für die Telefonie verfügbar ist, werden der Mobile Country Code (MCC) und die Signale für Network Identity and Time Zone (NITZ) verwendet.
Ein Gerät in Belgien kann die Zeitzone beispielsweise allein anhand des MCC ermitteln, der von nahe gelegenen Mobilfunkmasten gemeldet wird. Das ist möglich, weil in Belgien nur eine Zeitzone verwendet wird.
Wenn ein Land mehrere Zeitzonen verwendet, reicht der MCC allein nicht aus, um die Zeitzone zu ermitteln. In diesen Ländern verwendet das Gerät auch NITZ-Signale, um die richtige Zeitzone zu ermitteln. Das funktioniert an vielen Orten auf der Welt gut, erfordert aber, dass NITZ-Signale sowohl verfügbar als auch korrekt sind. Daher ist es von Mobilfunkanbietern abhängig.
Die Zeitzonenerkennung für die Telefonie ist ein passiver Detektor. Sie wird immer ausgeführt, sodass häufig Telefonieempfehlungen gegeben werden, auch wenn der aktive time_zone_detector-Algorithmus nicht für die Telefonie verwendet wird.
Einschränkung der Zeitzonenerkennung für die Telefonie
Auch wenn korrekte NITZ-Signale verfügbar sind, funktioniert die Zeitzonenerkennung für die Telefonie nicht immer in allen Ländern gut. Das liegt daran, dass NITZ nur Informationen zu Offset und Sommerzeit enthält, die nicht immer ausreichen, um eine Zeitzone eindeutig zu identifizieren.
Dieses Zeitzonenproblem kann an vielen Orten auf der Welt auftreten. Beispielsweise können Denver, Colorado, und Phoenix, Arizona, in den USA im Winter nicht anhand von NITZ-Signalen unterschieden werden, in anderen Jahreszeiten aber schon. An jedem Ort mit ähnlich überlappenden Zeitzonen kann dieses Problem auftreten.
In der folgenden Tabelle ist das Geräteverhalten je nach Jahreszeit für Denver und Phoenix als Beispiel aufgeschlüsselt:
| Ort und Jahreszeit | Informationen aus MCC oder NITZ | Erkannte Zeitzone und Verhalten |
|---|---|---|
| Denver, Colorado Winter |
Zeit: 1. Januar 2021, 12:00:00 Uhr Land: USA Offset: UTC-7, keine Sommerzeit |
Zwei Zonen-IDs stimmen überein:
Das Gerät ist korrekt auf Amerika/Denver eingestellt. |
| Phoenix, Arizona Winter |
Zeit: 1. Januar 2021, 12:00:00 Uhr Land: USA Offset: UTC-7, keine Sommerzeit |
Zwei Zonen-IDs stimmen überein:
Das Gerät ist falsch auf Amerika/Denver eingestellt. |
| Denver, Colorado Sommer |
Zeit: 1. Juli 2021, 12:00:00 Uhr Land: USA Offset: UTC-6, Sommerzeit |
Eine Zonen-ID stimmt überein:
Das Gerät ist korrekt auf Amerika/Denver eingestellt. |
| Phoenix, Arizona Sommer |
Zeit: 1. Juli 2021, 12:00:00 Uhr Land: USA Offset: UTC-7, keine Sommerzeit |
Eine Zonen-ID stimmt überein:
Das Gerät ist korrekt auf Amerika/Phoenix eingestellt. |
Die Beispiele in der Tabelle zeigen, dass Android-Geräte in Denver oder Arizona im Winter eine von zwei übereinstimmenden Zeitzonen-IDs auswählen müssen. Das kann für einige Geräte falsch sein, aber trotzdem eine scheinbar korrekte Ortszeit anzeigen. Die Gerätechronik, Kalender und andere Apps zeigen die erwartete Ortszeit an, auch wenn die Zeitzonen-ID falsch ist, da beide Zeitzonen-IDs im Winter dieselbe Ortszeit berechnen.
Im Frühjahr, wenn in Denver die Sommerzeit gilt und in Phoenix nicht, zeigen einige Geräte möglicherweise vorübergehend die falsche Ortszeit an, wenn sie auf die falsche Zeitzonen-ID für den Standort des Nutzers eingestellt sind. Das wird korrigiert, sobald das Gerät ein neues NITZ-Signal empfängt (insbesondere eines mit Offsetinformationen „UTC-7, keine Sommerzeit“). Das kann jedoch einige Zeit dauern und ist von den Mobilfunkanbietern abhängig.
Daher zeigen Kalender oder andere Apps, die die Zeitzonen-ID vom Winter in den Frühling übernehmen, möglicherweise die falsche Ortszeit an und verwenden sie, bis die relevanten Apps die Zeitzonen-ID aktualisieren.
Fehlerbehebung und Tests
Im folgenden Abschnitt werden Shell-Befehle zum Debuggen und Testen der Zeitzonenerkennung für die Telefonie beschrieben.
Testumgebung einrichten
Tester verwenden in der Regel eine Testumgebung mit einer Test- oder simulierten Mobilfunkzelle, um das Verhalten der Zeitzonenerkennung für die Telefonie zu prüfen. Mit der Testzelle können Netzwerke mit verschiedenen MCCs simuliert und NITZ-Signale an Geräte gesendet werden, um die Auswirkungen zu beobachten.
Damit das Gerät die Zeitzone erkennen kann, müssen die NITZ-Signalinformationen korrekt sein, mit dem MCC übereinstimmen und mit der Kopie der IANA TZDB (Zeitzonenregeln) auf dem Gerät übereinstimmen. NITZ-Signale, die nicht mit dem MCC übereinstimmen, führen dazu, dass der Telefoniealgorithmus unsicher wird.
Wenn der von der Testzelle verwendete MCC beispielsweise für die USA gilt, muss das NITZ-Signal eine UTC, einen Offset und Informationen zur Sommerzeit enthalten, die für einen Ort in den USA korrekt sind.
Mit dem Dienst com.android.phone interagieren
So prüfen Sie, ob das Gerät korrekte Vorschläge für die Zeitzonenerkennung für die Telefonie erhält:
adb shell dumpsys activity service \
com.android.phone/com.android.phone.TelephonyDebugServiceDadurch werden Telefonieinformationen ausgegeben, die auch in Android-Fehlerberichten zu finden sind. Auf Geräten mit mehreren SIM-Karten sind Informationen für jedes SIM-Funkmodul verfügbar.
In den Zeitzonenprotokollen werden die Vorschläge angezeigt, die der Telefonieprozess an `time_zone_detector` gesendet hat, und die Gründe für das Senden der Vorschläge.
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")]}