برای دستگاههای دارای Android 11 یا نسخههای پایینتر، تشخیص خودکار منطقه زمانی در «پروژه منبع باز Android» (AOSP) به سیگنالهای زیرسیستم تلفن وابسته است. بهدلیل وابستگی به زیرسیستم تلفن، تشخیص خودکار منطقه زمانی در Android 11 یا پایینتر به دستگاههای تلفن محدود میشود.
وقتی تشخیص منطقه زمانی تلفن دردسترس باشد، بااستفاده از کد کشور تلفن همراه (MCC) و سیگنالهای هویت شبکه و منطقه زمانی (NITZ) کار میکند.
برای مثال، دستگاهی در بلژیک میتواند منطقه زمانی را صرفاً براساس کد کشور تلفن همراه (MCC) گزارششده توسط برجهای سلولی اطراف شناسایی کند. این امکان وجود دارد زیرا بلژیک از یک منطقه زمانی واحد استفاده میکند.
وقتی کشوری از چند منطقه زمانی استفاده میکند، MCC بهتنهایی برای شناسایی منطقه زمانی کافی نیست. برای این کشورها، دستگاه از سیگنالهای NITZ نیز برای شناسایی منطقه زمانی صحیح استفاده میکند. این ویژگی در بسیاری از نقاط جهان بهخوبی کار میکند اما برای کار کردن به سیگنالهای NITZ نیاز دارد که هم دردسترس باشند و هم درست باشند و بنابراین به شرکتهای مخابراتی وابسته است.
تشخیص منطقه زمانی تلفنی یک آشکارساز غیرفعال است. این مدل همیشه اجرا میشود و بنابراین پیشنهادهای تلفنی اغلب حتی زمانی که الگوریتم فعال time_zone_detector تلفنی نیست ارائه میشوند.
محدودیت تشخیص منطقه زمانی تلفن
حتی با دردسترس بودن سیگنالهای NITZ صحیح، تشخیص منطقه زمانی تلفنی همیشه در همه کشورها بهخوبی کار نمیکند. دلیل این است که NITZ فقط حاوی اطلاعات جبران و ساعت تابستانی است که همیشه برای شناسایی یکتای منطقه زمانی کافی نیست.
مکانهای زیادی در دنیا وجود دارد که ممکن است این مشکل منطقه زمانی در آنها رخ دهد. برای مثال، دنور کلرادو و فینیکس آریزونا در ایالات متحده را نمیتوان بااستفاده از سیگنالهای NITZ درطول زمستان تشخیص داد، اما درطول فصلهای دیگر میتوان این کار را انجام داد. هر مکانی با مناطق زمانی همپوشانی مشابه ممکن است با این نوع مشکل مواجه شود.
جدول زیر رفتار دستگاه را بسته به فصل برای دنور و فینیکس بهعنوان نمونه نشان میدهد:
| مکان و فصل | اطلاعات از MCC یا NITZ | منطقه زمانی و رفتار شناساییشده |
|---|---|---|
| دنور، کلرادو زمستان |
زمان: ۱ ژانویه ۲۰۲۱، ۱۲:۰۰:۰۰ کشور: ایالات متحده انحراف: UTC-7، بدون ساعت تابستانی |
دو شناسه منطقه مطابقت دارد:
دستگاه روی America/Denver درست تنظیم شده است. |
| فینیکس، آریزونا زمستان |
زمان: ۱ ژانویه ۲۰۲۱، ۱۲:۰۰:۰۰ کشور: ایالات متحده انحراف: UTC-7، بدون ساعت تابستانی |
دو شناسه منطقه مطابقت دارد:
دستگاه بهاشتباه روی America/Denver تنظیم شده است. |
| دنور، کلرادو تابستان |
زمان: ۱ ژوئیه ۲۰۲۱ ۱۲:۰۰:۰۰ کشور: ایالات متحده انحراف: UTC-6، ساعت تابستانی |
یک شناسه منطقه مطابقت دارد:
دستگاه روی America/Denver درست تنظیم شده است. |
| فینیکس، آریزونا تابستان |
زمان: ۱ ژوئیه ۲۰۲۱ ۱۲:۰۰:۰۰ کشور: ایالات متحده اختلاف زمان: UTC-7، بدون ساعت تابستانی |
یک شناسه منطقه مطابقت دارد:
دستگاه روی America/Phoenix درست تنظیم شده است. |
مثالهای جدول نشان میدهد که درطول زمستان، دستگاههای Android در دنور یا آریزونا باید یکی از دو شناسه منطقه زمانی منطبق را انتخاب کنند که ممکن است برای برخیاز دستگاهها نادرست باشد اما همچنان زمان محلی ظاهراً درستی را نمایش دهد. ساعت دستگاه، تقویمها، و برنامههای دیگر زمان محلی موردانتظار را نمایش میدهند، حتی اگر شناسه منطقه زمانی نادرست باشد، زیرا هر دو شناسه منطقه زمانی درطول زمستان زمان محلی یکسانی را محاسبه میکنند.
بااینحال، در فصل بهار که دنور از ساعت تابستانی پیروی میکند و فینیکس پیروی نمیکند، اگر برخیاز دستگاهها روی شناسه منطقه زمانی اشتباه برای مکان کاربر تنظیم شده باشند، ممکن است بهطور موقت زمان محلی نادرستی را نشان دهند. بهمحض اینکه دستگاه سیگنال NITZ جدیدی دریافت کند (بهطور خاص، سیگنالی که حاوی اطلاعات جبران «UTC-7، بدون ساعت تابستانی» باشد)، این مشکل برطرف میشود، اما این کار ممکن است مدتی طول بکشد و به شرکتهای مخابراتی بستگی دارد.
درنتیجه، تقویمها یا برنامههای دیگری که شناسه منطقه زمانی را از زمستان به بهار ذخیره یا منتقل میکنند ممکن است تا زمانی که برنامههای مربوطه شناسه منطقه زمانی را بهروزرسانی کنند، زمان محلی اشتباهی را نمایش دهند و از آن استفاده کنند.
اشکالزدایی و آزمایش
بخش زیر فرمانهای پوسته را برای اشکالزدایی و آزمایش ویژگی تشخیص منطقه زمانی تلفن شرح میدهد.
راهاندازی محیط آزمایش
آزمایشکنندگان معمولاً از محیط آزمایشی با سلول تلفنی آزمایشی یا شبیهسازیشده استفاده میکنند تا رفتار تشخیص منطقه زمانی تلفنی را بررسی کنند. از سلول آزمایشی میتوان برای شبیهسازی شبکههایی با MCCهای مختلف و ارسال سیگنالهای NITZ به دستگاهها و سپس نظارت بر تأثیرات آنها استفاده کرد.
برای اینکه دستگاه منطقه زمانی را تشخیص دهد، اطلاعات سیگنال NITZ باید صحیح باشد، با MCC سازگار باشد، و با نسخه دستگاه از IANA TZDB (قوانین منطقه زمانی) مطابقت داشته باشد. سیگنالهای NITZ که با MCC ناسازگار هستند باعث میشوند الگوریتم تلفن نامطمئن شود.
برای مثال، اگر کد کشور تلفن همراه استفادهشده توسط سلول آزمایش مربوط به ایالات متحده امریکا باشد، سیگنال 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")]}