Deteksi zona waktu telepon

Untuk perangkat yang menjalankan Android 11 atau yang lebih rendah, deteksi zona waktu otomatis di AOSP mengandalkan sinyal dari subsistem teleponi. Karena adanya dependensi pada subsistem telepon, deteksi zona waktu otomatis di Android 11 atau yang lebih rendah terbatas pada perangkat telepon.

Jika deteksi zona waktu telepon tersedia, deteksi ini akan berfungsi menggunakan sinyal kode negara seluler (MCC) dan Network Identity and Time Zone (NITZ).

Misalnya, perangkat di Belgia dapat mengidentifikasi zona waktu hanya berdasarkan MCC yang dilaporkan oleh menara seluler di sekitar. Hal ini dimungkinkan karena Belgia diketahui menggunakan satu zona waktu.

Jika suatu negara menggunakan beberapa zona waktu, MCC saja tidak cukup untuk mengidentifikasi zona waktu. Untuk negara-negara ini, perangkat juga menggunakan sinyal NITZ untuk mengidentifikasi zona waktu yang benar. Cara ini berfungsi dengan baik di banyak tempat di seluruh dunia, tetapi memerlukan sinyal NITZ yang tersedia dan akurat, sehingga bergantung pada operator.

Deteksi zona waktu teleponi adalah detektor pasif. Fitur ini berjalan setiap saat dan saran telepon sering kali dibuat meskipun algoritma time_zone_detector yang aktif saat ini bukan telepon.

Batasan deteksi zona waktu telepon

Meskipun sinyal NITZ yang benar tersedia, deteksi zona waktu telepon tidak selalu berfungsi dengan baik di setiap negara. Hal ini karena NITZ hanya berisi informasi selisih waktu dan waktu musim panas, yang tidak selalu cukup untuk mengidentifikasi zona waktu secara unik.

Ada banyak tempat di dunia yang mungkin mengalami masalah zona waktu ini. Misalnya, Denver Colorado dan Phoenix Arizona di Amerika Serikat tidak dapat dibedakan menggunakan sinyal NITZ selama musim dingin, tetapi dapat dibedakan selama musim lainnya. Lokasi mana pun dengan zona waktu yang tumpang-tindih serupa dapat mengalami masalah semacam ini.

Tabel berikut menguraikan perilaku perangkat bergantung pada musim untuk Denver dan Phoenix sebagai contoh:

Lokasi dan musim Informasi dari MCC atau NITZ Zona waktu dan perilaku yang terdeteksi
Denver, Colorado
Musim Dingin
Waktu: 1 Januari 2021 12.00.00
Negara: AS
Selisih: UTC-7, tidak ada waktu musim panas
Dua ID zona cocok:
  • Amerika/Denver
  • Amerika/Phoenix

Perangkat disetel dengan benar ke America/Denver.
Phoenix, Arizona
Musim Dingin
Waktu: 1 Januari 2021 12.00.00
Negara: AS
Selisih: UTC-7, tidak ada waktu musim panas
Dua ID zona cocok:
  • Amerika/Denver
  • Amerika/Phoenix

Perangkat salah disetel ke America/Denver.
Denver, Colorado
Musim Panas
Waktu: 1 Juli 2021 12.00.00
Negara: Amerika Serikat
Selisih: UTC-6, waktu musim panas
Satu ID zona cocok:
  • Amerika/Denver

Perangkat disetel dengan benar ke America/Denver.
Phoenix, Arizona
Summer
Waktu: 1 Juli 2021 12.00.00
Negara: Amerika Serikat
Selisih waktu: UTC-7, tidak ada waktu musim panas
Satu ID zona cocok:
  • Amerika/Phoenix

Perangkat telah disetel dengan benar ke America/Phoenix.

Contoh dalam tabel menunjukkan bahwa selama musim dingin, perangkat Android di Denver atau Arizona harus memilih salah satu dari dua ID zona waktu yang cocok, yang mungkin salah untuk beberapa perangkat, tetapi tetap menampilkan waktu lokal yang tampaknya benar. Jam perangkat, kalender, dan aplikasi lain menampilkan waktu setempat yang diharapkan meskipun ID zona waktu salah karena kedua ID zona waktu menghitung waktu setempat yang sama selama musim dingin.

Namun, pada musim semi saat Denver mengamati waktu musim panas dan Phoenix tidak, beberapa perangkat mungkin untuk sementara menampilkan waktu lokal yang salah jika perangkat tersebut disetel ke ID zona waktu yang salah untuk lokasi pengguna. Hal ini diperbaiki segera setelah perangkat menerima sinyal NITZ baru (khususnya, yang berisi informasi offset "UTC-7, tanpa daylight saving"), tetapi hal ini dapat memerlukan waktu dan bergantung pada operator.

Akibatnya, kalender atau aplikasi lain yang menyimpan atau meneruskan ID zona waktu dari musim dingin ke musim semi dapat menampilkan dan menggunakan waktu lokal yang salah hingga aplikasi yang relevan memperbarui ID zona waktu.

Proses debug dan pengujian

Bagian berikut menjelaskan perintah shell untuk men-debug dan menguji fitur deteksi zona waktu telepon.

Penyiapan lingkungan pengujian

Penguji biasanya menggunakan lingkungan pengujian dengan sel teleponi yang disimulasikan atau diuji untuk memeriksa perilaku deteksi zona waktu teleponi. Sel pengujian dapat digunakan untuk mensimulasikan jaringan dengan MCC yang berbeda dan mengirim sinyal NITZ ke perangkat, lalu memantau efeknya.

Agar perangkat dapat mendeteksi zona waktu, informasi sinyal NITZ harus benar, konsisten dengan MCC, dan cocok dengan salinan TZDB IANA (aturan zona waktu) perangkat. Sinyal NITZ yang tidak konsisten dengan MCC menyebabkan algoritma teleponi menjadi tidak pasti.

Misalnya, jika MCC yang digunakan oleh sel pengujian adalah untuk Amerika Serikat, sinyal NITZ harus berisi UTC, selisih waktu, dan informasi waktu musim panas yang benar untuk suatu tempat di Amerika Serikat.

Berinteraksi dengan layanan com.android.phone

Untuk memverifikasi bahwa perangkat menerima saran zona waktu teleponi yang benar, gunakan:

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

Opsi ini akan menampilkan informasi telepon, yang juga dapat ditemukan dalam laporan bug Android. Di perangkat dengan beberapa SIM, ada informasi untuk setiap radio SIM.

Time zone Logs menampilkan saran yang telah dikirim oleh proses telepon ke time_zone_detector dan alasan pengiriman saran tersebut.

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")]}