تشخیص منطقه زمانی تلفن

برای دستگاه‌هایی که Android 11 یا پایین‌تر دارند، تشخیص خودکار منطقه زمانی در AOSP به سیگنال‌های زیرسیستم تلفن متکی است. به دلیل وابستگی به زیرسیستم تلفن، تشخیص خودکار منطقه زمانی در Android 11 یا پایین‌تر به دستگاه‌های تلفن محدود می‌شود.

هنگامی که تشخیص منطقه زمانی تلفن در دسترس باشد، با استفاده از سیگنال‌های کد کشور تلفن همراه (MCC) و شناسه شبکه و منطقه زمانی (NITZ) کار می‌کند.

به عنوان مثال، دستگاهی در فرانسه می تواند منطقه زمانی را تنها بر اساس MCC گزارش شده توسط برج های سلولی مجاور شناسایی کند. این امکان پذیر است زیرا فرانسه از یک منطقه زمانی استفاده می کند.

وقتی یک کشور از چندین منطقه زمانی استفاده می کند، MCC به تنهایی برای شناسایی منطقه زمانی کافی نیست. برای این کشورها، دستگاه همچنین از سیگنال های NITZ برای شناسایی منطقه زمانی صحیح استفاده می کند. این در بسیاری از نقاط در سراسر جهان به خوبی کار می کند، اما مستلزم آن است که سیگنال های NITZ هم در دسترس و هم صحیح باشند و بنابراین به حامل ها وابسته است.

تشخیص منطقه زمانی تلفن یک آشکارساز غیرفعال است. همیشه اجرا می شود و بنابراین پیشنهادات تلفنی اغلب حتی زمانی که مبدا time_zone_detector در حال حاضر تلفنی نیست ارائه می شود.

محدودیت تشخیص منطقه زمانی تلفن

حتی با وجود سیگنال‌های صحیح NITZ، تشخیص منطقه زمانی تلفن همیشه در هر کشوری به خوبی کار نمی‌کند. این به این دلیل است که NITZ فقط حاوی اطلاعات افست و صرفه جویی در روز است که همیشه برای شناسایی منحصر به فرد منطقه زمانی کافی نیست.

مکان های زیادی در جهان وجود دارد که ممکن است این مشکل منطقه زمانی رخ دهد. به عنوان مثال، دنور کلرادو و فینیکس آریزونا در ایالات متحده را نمی توان با استفاده از سیگنال های NITZ در طول زمستان تشخیص داد، اما در فصول دیگر قابل تشخیص است. هر مکانی با مناطق زمانی مشابه همپوشانی ممکن است با این نوع مشکل مواجه شود.

جدول زیر رفتار دستگاه را بسته به فصل برای دنور و فینیکس به عنوان مثال تجزیه می کند:

مکان و فصل اطلاعات از MCC یا NITZ منطقه زمانی و رفتار شناسایی شده است
دنور، کلرادو
زمستان
زمان: 1 ژانویه 2021 ساعت 12:00
کشور: آمریکا
افست: UTC-7، بدون صرفه جویی در روز
شناسه دو منطقه مطابقت دارد:
  • آمریکا/دنور
  • آمریکا/ققنوس

دستگاه به درستی روی America/Denver تنظیم شده است.
فینیکس، آریزونا
زمستان
زمان: 1 ژانویه 2021 ساعت 12:00
کشور: آمریکا
افست: UTC-7، بدون صرفه جویی در روز
شناسه دو منطقه مطابقت دارد:
  • آمریکا/دنور
  • آمریکا/ققنوس

دستگاه به اشتباه روی America/Denver تنظیم شده است.
دنور، کلرادو
تابستان
زمان: 1 جولای 2021 ساعت 12:00
کشور: آمریکا
افست: UTC-6، صرفه جویی در نور روز
شناسه یک منطقه مطابقت دارد:
  • آمریکا/دنور

دستگاه به درستی روی America/Denver تنظیم شده است.
فینیکس، آریزونا
تابستان
زمان: 1 جولای 2021 ساعت 12:00
کشور: آمریکا
افست: UTC-7، بدون صرفه جویی در روز
شناسه یک منطقه مطابقت دارد:
  • آمریکا/ققنوس

دستگاه به درستی روی America/Phoenix تنظیم شده است.

مثال‌های بالا نشان می‌دهند که در طول زمستان، دستگاه‌های Android در دنور یا آریزونا باید یکی از دو شناسه منطقه زمانی منطبق را انتخاب کنند، که ممکن است برای برخی دستگاه‌ها نادرست باشد، اما همچنان زمان محلی ظاهراً صحیح را نشان می‌دهد. ساعت دستگاه، تقویم‌ها و سایر برنامه‌ها زمان محلی مورد انتظار را نشان می‌دهند، حتی اگر شناسه منطقه زمانی نادرست باشد، زیرا هر دو شناسه منطقه زمانی، زمان محلی مشابهی را در زمستان محاسبه می‌کنند.

با این حال، در بهار، زمانی که دنور ساعت تابستانی را مشاهده می‌کند و فونیکس این کار را نمی‌کند، برخی از دستگاه‌ها ممکن است به طور موقت زمان محلی نادرست را نشان دهند اگر روی شناسه منطقه زمانی اشتباه برای مکان کاربر تنظیم شده باشند. این به محض دریافت سیگنال NITZ جدید توسط دستگاه تصحیح می‌شود (مخصوصاً، سیگنالی که حاوی اطلاعات آفست «UTC-7، بدون صرفه‌جویی در نور روز» است)، اما ممکن است مدتی طول بکشد و به حامل‌ها بستگی دارد.

در نتیجه، تقویم‌ها یا سایر برنامه‌هایی که شناسه منطقه زمانی را از زمستان تا بهار ذخیره یا حمل می‌کنند، ممکن است تا زمانی که برنامه‌های مربوطه شناسه منطقه زمانی را به‌روزرسانی کنند، زمان محلی اشتباهی را نشان داده و از آن استفاده کنند.

اشکال زدایی و تست

بخش زیر دستورات پوسته برای اشکال زدایی و آزمایش ویژگی تشخیص منطقه زمانی تلفن را توضیح می دهد.

تست تنظیمات محیط

آزمایش کننده ها معمولاً از یک محیط آزمایشی با سلول تلفنی آزمایشی یا شبیه سازی شده برای بررسی رفتار تشخیص منطقه زمانی تلفن استفاده می کنند. سلول آزمایش می تواند برای شبیه سازی شبکه ها با MCC های مختلف و ارسال سیگنال های NITZ به دستگاه ها و سپس نظارت بر اثرات آنها استفاده شود.

برای اینکه دستگاه بتواند منطقه زمانی را تشخیص دهد، اطلاعات سیگنال NITZ باید صحیح، مطابق با MCC باشد و با کپی دستگاه از IANA TZDB (قوانین منطقه زمانی) مطابقت داشته باشد. سیگنال‌های NITZ که با MCC ناسازگار هستند باعث می‌شوند مبدا تلفن نامشخص شود.

به عنوان مثال، اگر MCC مورد استفاده سلول آزمایشی برای ایالات متحده باشد، سیگنال NITZ باید حاوی اطلاعات "زمان جهانی"، افست و صرفه جویی در روز باشد که برای جایی در ایالات متحده صحیح است.

تعامل با سرویس com.android.phone

برای تأیید اینکه دستگاه پیشنهادات منطقه زمانی تلفنی صحیح را دریافت می‌کند، از موارد زیر استفاده کنید:

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

این اطلاعات تلفنی را که در گزارش های باگ اندروید نیز یافت می شود، حذف می کند. در دستگاه‌های دارای چند سیم‌کارت، اطلاعاتی برای هر سیم‌کارت رادیویی وجود دارد.

گزارش‌های منطقه زمانی پیشنهاداتی را که فرآیند تلفن به 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")]}