זיהוי אזור הזמן של שיחות טלפון

במכשירים עם Android בגרסה 11 או בגרסאות מוקדמות יותר, זיהוי אוטומטי של אזור זמן ב-פרויקט קוד פתוח של Android ‏ (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.
Denver, Colorado
Summer
השעה: 1 ביולי 2021, 12:00:00
המדינה: ארה"ב
ההפרש: UTC-6, שעון קיץ
מזהה אזור אחד תואם:
  • אמריקה/דנבר

המכשיר מוגדר נכון לאזור הזמן America/Denver.
פיניקס, אריזונה
קיץ
השעה: 1 ביולי 2021, 12:00:00
המדינה: ארה"ב
ההפרש: UTC-7, ללא שעון קיץ
מזהה אזור אחד תואם:
  • אמריקה/פיניקס

המכשיר מוגדר כראוי לאזור הזמן America/Phoenix.

הדוגמאות בטבלה מראות שבמהלך החורף, מכשירי Android בדנוור או באריזונה צריכים לבחור אחד משני מזהי אזורי זמן תואמים, שיכול להיות שיהיה שגוי בחלק מהמכשירים, אבל עדיין יוצג זמן מקומי שנראה נכון. השעה המקומית שמוצגת בשעון, ביומנים ובאפליקציות אחרות במכשיר היא השעה המקומית הצפויה, גם אם מזהה אזור הזמן שגוי, כי שני מזהי אזורי הזמן מחשבים את אותה שעה מקומית במהלך החורף.

עם זאת, באביב, כשדנוור עוברת לשעון קיץ ופיניקס לא, יכול להיות שבחלק מהמכשירים תוצג באופן זמני השעה המקומית הלא נכונה אם הם מוגדרים למזהה אזור זמן שגוי למיקום של המשתמש. השעה תתוקן ברגע שהמכשיר יקבל אות NITZ חדש (במיוחד, אות שמכיל מידע על היסט של UTC-7, ללא שעון קיץ), אבל זה יכול לקחת זמן ותלוי בספקי הסלולר.

כתוצאה מכך, יכול להיות שיוצג בלוחות שנה או באפליקציות אחרות שמאחסנות או מעבירות את מזהה אזור הזמן מהחורף לאביב, וישמש בהם זמן מקומי שגוי עד שהאפליקציות הרלוונטיות יעודכנו עם מזהה אזור הזמן הנכון.

ניפוי באגים ובדיקה

בקטע הבא מתוארות פקודות של מעטפת (shell) לניפוי באגים ולבדיקה של התכונה לזיהוי אזור זמן בטלפוניה.

הגדרת סביבת בדיקה

בודקים בדרך כלל משתמשים בסביבת בדיקה עם תא טלפוניה לבדיקה או לסימולציה כדי לבדוק את התנהגות זיהוי אזור הזמן בטלפוניה. אפשר להשתמש בתא הבדיקה כדי לדמות רשתות עם קודי MCC שונים, לשלוח אותות NITZ למכשירים ולעקוב אחרי ההשפעות שלהם.

כדי שהמכשיר יזהה את אזור הזמן, נתוני האות של NITZ צריכים להיות נכונים, עקביים עם קוד המדינה (MCC) ותואמים לעותק של IANA TZDB (כללי אזור הזמן) במכשיר. אותות 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")]}