टेलीफ़ोन के टाइम ज़ोन की पहचान करने की सुविधा

Android 11 या इससे पहले के वर्शन वाले डिवाइसों के लिए, AOSP में टाइम ज़ोन का अपने-आप पता लगाने की सुविधा, टेलीफ़ोनी सबसिस्टम से मिलने वाले सिग्नल पर निर्भर करती है. टेलीफ़ोनी सबसिस्टम पर निर्भर होने की वजह से, Android 11 या उससे पहले के वर्शन पर टाइम ज़ोन का अपने-आप पता लगाने की सुविधा, सिर्फ़ टेलीफ़ोनी डिवाइसों पर काम करती है.

टेलीफ़ोनी टाइम ज़ोन का पता लगाने की सुविधा उपलब्ध होने पर, यह मोबाइल कंट्री कोड (एमसीसी) और नेटवर्क आइडेंटिटी और टाइम ज़ोन (एनआईटीज़ेड) सिग्नल का इस्तेमाल करके काम करती है.

उदाहरण के लिए, बेल्जियम में मौजूद कोई डिवाइस, आस-पास के मोबाइल टॉवर से मिले एमसीसी के आधार पर टाइम ज़ोन की पहचान कर सकता है. ऐसा इसलिए हो सकता है, क्योंकि बेल्जियम में एक ही टाइम ज़ोन का इस्तेमाल किया जाता है.

जब किसी देश में एक से ज़्यादा टाइम ज़ोन का इस्तेमाल किया जाता है, तो सिर्फ़ एमसीसी से टाइम ज़ोन का पता नहीं लगाया जा सकता. इन देशों में, डिवाइस सही टाइम ज़ोन का पता लगाने के लिए NITZ सिग्नल का भी इस्तेमाल करता है. यह सुविधा दुनिया भर में कई जगहों पर अच्छी तरह से काम करती है. हालांकि, इसके लिए ज़रूरी है कि NITZ सिग्नल उपलब्ध हों और सही हों. इसलिए, यह सुविधा कैरियर पर निर्भर करती है.

टेलीफ़ोनी टाइम ज़ोन की पहचान करने की सुविधा, पैसिव डिटेक्टर है. यह हमेशा चालू रहता है. इसलिए, टेलीफ़ोनी के सुझाव अक्सर तब भी दिए जाते हैं, जब ऐक्टिव time_zone_detector एल्गोरिदम फ़िलहाल टेलीफ़ोनी नहीं होता है.

टेलीफ़ोनी के समय क्षेत्र की पहचान करने की सुविधा की सीमाएं

सही NITZ सिग्नल उपलब्ध होने पर भी, टेलीफ़ोनी टाइम ज़ोन का पता लगाने की सुविधा हर देश में हमेशा सही तरीके से काम नहीं करती. ऐसा इसलिए है, क्योंकि NITZ में सिर्फ़ ऑफ़सेट और डेलाइट सेविंग की जानकारी होती है. यह जानकारी, किसी टाइम ज़ोन की पहचान करने के लिए हमेशा काफ़ी नहीं होती.

दुनिया में कई ऐसी जगहें हैं जहां टाइम ज़ोन की यह समस्या हो सकती है. उदाहरण के लिए, अमेरिका में डेनवर, कोलोराडो और फ़ीनिक्स, ऐरिज़ोना के बीच सर्दियों के दौरान NITZ सिग्नल का इस्तेमाल करके अंतर नहीं किया जा सकता. हालांकि, अन्य सीज़न में ऐसा किया जा सकता है. जिन जगहों के टाइम ज़ोन एक-दूसरे से मिलते-जुलते हैं वहां इस तरह की समस्या आ सकती है.

यहां दी गई टेबल में, डेनवर और फ़ीनिक्स के उदाहरण के तौर पर, मौसम के हिसाब से डिवाइस के व्यवहार के बारे में बताया गया है:

जगह और सीज़न एमसीसी या एनआईटीज़ से मिली जानकारी पहचाना गया टाइम ज़ोन और व्यवहार
डेनवर, कोलोराडो
सर्दियों के मौसम में
समय: 1 जनवरी, 2021 12:00:00
देश: अमेरिका
ऑफ़सेट: यूटीसी-7, डेलाइट सेविंग नहीं
दो ज़ोन आईडी मेल खाते हैं:
  • America/Denver
  • America/Phoenix

डिवाइस पर अमेरिका/डेनवर का समय सही तरीके से सेट किया गया है.
फ़ीनिक्स, ऐरिज़ोना
सर्दियां
समय: 1 जनवरी, 2021 12:00:00
देश: अमेरिका
ऑफ़सेट: यूटीसी-7, डेलाइट सेविंग नहीं
दो ज़ोन आईडी मेल खाते हैं:
  • America/Denver
  • America/Phoenix

डिवाइस को America/Denver पर गलत तरीके से सेट किया गया है.
डेनवर, कोलोराडो
गर्मी
समय: 1 जुलाई, 2021 दोपहर 12:00:00
देश: अमेरिका
ऑफ़सेट: यूटीसी-6, डेलाइट सेविंग
एक ज़ोन आईडी मैच करता है:
  • America/Denver

डिवाइस पर अमेरिका/डेनवर का समय सही तरीके से सेट किया गया है.
फ़ीनिक्स, ऐरिज़ोना
गर्मियां
समय: 1 जुलाई, 2021 दोपहर 12:00:00
देश: अमेरिका
ऑफ़सेट: यूटीसी-7, डेलाइट सेविंग नहीं
एक ज़ोन आईडी मैच करता है:
  • America/Phoenix

डिवाइस पर अमेरिका/फ़ीनिक्स का समय सही तरीके से सेट किया गया है.

टेबल में दिए गए उदाहरणों से पता चलता है कि सर्दियों के दौरान, डेनवर या ऐरिज़ोना में मौजूद Android डिवाइसों को, मैच करने वाले दो टाइम ज़ोन आईडी में से किसी एक को चुनना होगा. ऐसा हो सकता है कि यह आईडी कुछ डिवाइसों के लिए गलत हो, लेकिन फिर भी स्थानीय समय सही दिखे. डिवाइस की घड़ी, कैलेंडर, और अन्य ऐप्लिकेशन में, स्थानीय समय सही दिखता है. भले ही, टाइम ज़ोन आईडी गलत हो. ऐसा इसलिए होता है, क्योंकि सर्दियों के दौरान दोनों टाइम ज़ोन आईडी से एक ही स्थानीय समय का हिसाब लगाया जाता है.

हालांकि, वसंत के मौसम में डेनवर में डेलाइट सेविंग टाइम लागू होता है, लेकिन फ़ीनिक्स में नहीं. इसलिए, अगर उपयोगकर्ता की जगह के हिसाब से कुछ डिवाइसों में गलत टाइम ज़ोन आईडी सेट किया गया है, तो हो सकता है कि उनमें कुछ समय के लिए गलत स्थानीय समय दिखे. डिवाइस को नया NITZ सिग्नल मिलते ही, यह समस्या ठीक हो जाती है. खास तौर पर, ऐसा सिग्नल जिसमें "यूटीसी-7, डेलाइट सेविंग नहीं" ऑफ़सेट की जानकारी शामिल हो. हालांकि, इसमें कुछ समय लग सकता है और यह कैरियर पर निर्भर करता है.

इस वजह से, कैलेंडर या अन्य ऐप्लिकेशन, सर्दियों से लेकर वसंत तक के टाइम ज़ोन आईडी को सेव या ट्रांसफ़र करते हैं. ऐसे में, ये ऐप्लिकेशन टाइम ज़ोन आईडी को अपडेट करने तक, गलत स्थानीय समय दिखा सकते हैं और उसका इस्तेमाल कर सकते हैं.

डीबग करना और जांच करना

इस सेक्शन में, टेलीफ़ोनी टाइम ज़ोन का पता लगाने की सुविधा को डीबग करने और उसकी जांच करने के लिए शेल कमांड के बारे में बताया गया है.

टेस्ट एनवायरमेंट सेटअप करना

टेस्टर आम तौर पर, टेस्ट एनवायरमेंट का इस्तेमाल करते हैं. इसमें टेस्ट या सिम्युलेटेड टेलीफ़ोनी सेल होती है. इससे टेलीफ़ोनी टाइम ज़ोन का पता लगाने के तरीके की जांच की जाती है. टेस्ट सेल का इस्तेमाल, अलग-अलग एमसीसी वाले नेटवर्क को सिम्युलेट करने के लिए किया जा सकता है. साथ ही, डिवाइसों को NITZ सिग्नल भेजने और फिर उनके असर को मॉनिटर करने के लिए किया जा सकता है.

डिवाइस को टाइम ज़ोन का पता लगाने के लिए, यह ज़रूरी है कि NITZ सिग्नल की जानकारी सही हो, एमसीसी के मुताबिक हो, और IANA TZDB (टाइम ज़ोन के नियम) की डिवाइस की कॉपी से मेल खाती हो. एमसीसी से मेल न खाने वाले NITZ सिग्नल की वजह से, टेलीफ़ोनी एल्गोरिदम को सही जानकारी नहीं मिल पाती.

उदाहरण के लिए, अगर टेस्ट सेल के लिए इस्तेमाल किया गया एमसीसी अमेरिका का है, तो NITZ सिग्नल में यूटीसी, ऑफ़सेट, और डेलाइट सेविंग की ऐसी जानकारी होनी चाहिए जो अमेरिका के किसी हिस्से के लिए सही हो.

com.android.phone सेवा के साथ इंटरैक्ट करना

यह पुष्टि करने के लिए कि डिवाइस को टेलीफ़ोनी टाइम ज़ोन के सही सुझाव मिल रहे हैं, इसका इस्तेमाल करें:

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

इससे टेलीफ़ोनी की जानकारी डंप होती है. यह जानकारी, Android की गड़बड़ी की रिपोर्ट में भी मिल सकती है. एक से ज़्यादा सिम वाले डिवाइसों पर, हर सिम रेडियो के लिए जानकारी मौजूद होती है.

टाइम ज़ोन के लॉग में, वे सुझाव दिखते हैं जो टेलीफ़ोनी प्रोसेस ने 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")]}