במכשירים עם Android בגרסה 11 או בגרסאות מוקדמות יותר, הזיהוי האוטומטי של אזור הזמן ב-Android Open Source Project (AOSP) מסתמך על אותות ממערכת המשנה של הטלפוניה. בגלל התלות במערכת המשנה של הטלפוניה, זיהוי אוטומטי של אזור זמן ב-Android 11 או בגרסאות קודמות מוגבל למכשירי טלפוניה.
כשזיהוי אזור הזמן בטלפון זמין, הוא פועל באמצעות קוד המדינה של הרשת הסלולרית (MCC) והאותות של זהות הרשת ואזור הזמן (NITZ).
לדוגמה, מכשיר בבלגיה יכול לזהות את אזור הזמן על סמך קוד המדינה (MCC) שמדווח על ידי אנטנות סלולריות בקרבת מקום. הסיבה לכך היא שבלגיה ידועה בשימוש באזור זמן יחיד.
כשמדינה מסוימת משתמשת בכמה אזורי זמן, קוד המדינה לנייד (MCC) לבדו לא מספיק כדי לזהות את אזור הזמן. במדינות האלה, המכשיר משתמש גם באותות NITZ כדי לזהות את אזור הזמן הנכון. השיטה הזו עובדת טוב בהרבה מקומות בעולם, אבל היא דורשת שאותות NITZ יהיו זמינים ונכונים, ולכן היא תלויה בספקי הסלולר.
זיהוי אזור הזמן בטלפוניה הוא מזהה פסיבי. הוא פועל כל הזמן, ולכן ההצעות לשיחות טלפון מוצגות לעיתים קרובות גם כשהאלגוריתם הפעיל time_zone_detector
לא קשור לטלפוניה.
מגבלה בזיהוי אזור הזמן בטלפוניה
גם אם יש אותות NITZ תקינים, זיהוי אזור הזמן בטלפוניה לא תמיד פועל טוב בכל מדינה. הסיבה לכך היא ש-NITZ מכיל רק מידע על הפרש השעות ועל שעון הקיץ, שלא תמיד מספיק כדי לזהות אזור זמן באופן ייחודי.
יש הרבה מקומות בעולם שבהם יכולה להתרחש בעיה כזו של אזור זמן. לדוגמה, אי אפשר להבחין בין דנוור שבקולורדו לבין פיניקס שבאריזונה בארה"ב באמצעות אותות NITZ במהלך החורף, אבל אפשר להבחין ביניהן בעונות אחרות. יכול להיות שבעיה כזו תתרחש בכל מיקום עם אזורי זמן חופפים דומים.
בטבלה הבאה מפורטת התנהגות המכשיר בהתאם לעונה בדנוור ובפיניקס לדוגמה:
מיקום ועונה | מידע מ-MCC או מ-NITZ | אזור הזמן וההתנהגות שזוהו |
---|---|---|
Denver, Colorado Winter |
שעה: 1 בינואר 2021, 12:00:00 מדינה: ארה"ב הפרש: UTC-7, ללא שעון קיץ |
שני מזהי אזורים זהים:
המכשיר מוגדר נכון לאזור הזמן America/Denver. |
פיניקס, אריזונה חורף |
שעה: 1 בינואר 2021, 12:00:00 מדינה: ארה"ב הפרש: UTC-7, ללא שעון קיץ |
שני מזהי אזורים זהים:
המכשיר מוגדר באופן שגוי לאזור הזמן America/Denver. |
דנבר, קולורדו קיץ |
השעה: 1 ביולי 2021, 12:00:00 המדינה: ארה"ב ההפרש: UTC-6, שעון קיץ |
מזהה אזור אחד תואם:
המכשיר מוגדר נכון לאזור הזמן America/Denver. |
פיניקס, אריזונה קיץ |
שעה: 1 ביולי 2021, 12:00:00 מדינה: ארה"ב הפרש: UTC-7, ללא שעון קיץ |
מזהה אזור אחד תואם:
המכשיר מוגדר כראוי לאזור הזמן America/Phoenix. |
הדוגמאות בטבלה מראות שבמהלך החורף, מכשירי Android בדנוור או באריזונה צריכים לבחור אחד משני מזהי אזורי זמן תואמים, שיכול להיות שיהיה שגוי בחלק מהמכשירים, אבל עדיין יוצג זמן מקומי שנראה נכון. השעון, היומנים ואפליקציות אחרות במכשיר מציגים את השעה המקומית הצפויה גם אם מזהה אזור הזמן שגוי, כי שני מזהי אזור הזמן מחשבים את אותה שעה מקומית במהלך החורף.
עם זאת, באביב, כשבדנוור יש שעון קיץ ובפיניקס אין, יכול להיות שבמכשירים מסוימים תוצג באופן זמני השעה המקומית הלא נכונה אם הם מוגדרים למזהה אזור זמן שגוי למיקום של המשתמש. השעה תתוקן ברגע שהמכשיר יקבל אות NITZ חדש (במיוחד, אות שמכיל מידע על היסט של UTC-7, ללא שעון קיץ), אבל זה יכול לקחת זמן ותלוי בספקי הסלולר.
כתוצאה מכך, יכול להיות שיוצג בלוחות שנה או באפליקציות אחרות שמאחסנות או מעבירות את מזהה אזור הזמן מהחורף לאביב, וישמש בהם זמן מקומי שגוי עד שהאפליקציות הרלוונטיות יעודכנו עם מזהה אזור הזמן הנכון.
ניפוי באגים ובדיקה
בקטע הבא מתוארות פקודות של מעטפת (shell) לניפוי באגים ולבדיקה של התכונה לזיהוי אזור זמן בטלפוניה.
הגדרת סביבת בדיקה
בודקים בדרך כלל משתמשים בסביבת בדיקה עם תא טלפוניה לבדיקה או לסימולציה כדי לבדוק את התנהגות זיהוי אזור הזמן בטלפוניה. אפשר להשתמש בתא הבדיקה כדי לדמות רשתות עם קודי מדינה שונים, לשלוח אותות NITZ למכשירים ולעקוב אחרי ההשפעות שלהם.
כדי שהמכשיר יזהה את אזור הזמן, נתוני האות של NITZ צריכים להיות נכונים, עקביים עם קוד המדינה (MCC) ותואמים לעותק של TZDB (מסד נתונים של אזורי זמן) של IANA במכשיר. אותות NITZ שלא עקביים עם קוד המדינה (MCC) גורמים לאלגוריתם הטלפוניה להיות לא ודאי.
לדוגמה, אם חשבון הניהול שבו נעשה שימוש בתא הבדיקה הוא בארה"ב, אות ה-NITZ צריך להכיל UTC, היסט ומידע על שעון קיץ שמתאימים למקום כלשהו בארה"ב.
יצירת אינטראקציה עם השירות com.android.phone
כדי לוודא שהמכשיר מקבל הצעות נכונות לאזור זמן לטלפוניה, צריך להשתמש בפקודה:
adb shell dumpsys activity service \
com.android.phone/com.android.phone.TelephonyDebugService
הפעולה הזו יוצרת קובץ dump של מידע על הטלפוניה, שאפשר למצוא גם בדוחות על באגים ב-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")]}