Deteksi Zona Waktu Teleponi

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

Ketika deteksi zona waktu telepon tersedia, ia bekerja menggunakan sinyal Kode Negara Seluler (MCC) dan Identitas Jaringan dan Zona Waktu (NITZ) .

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

Jika suatu negara menggunakan beberapa zona waktu, MCC saja tidak cukup untuk mengidentifikasi zona waktu. Untuk negara-negara tersebut, perangkat juga menggunakan sinyal NITZ untuk mengidentifikasi zona waktu yang tepat. Ini bekerja dengan baik di banyak tempat di seluruh dunia tetapi memerlukan sinyal NITZ tersedia dan benar dan oleh karena itu bergantung pada operator.

Deteksi zona waktu telepon adalah detektor pasif . Ini berjalan setiap saat sehingga saran telepon sering kali dibuat bahkan ketika algoritma time_zone_detector yang aktif saat ini bukan telepon.

Batasan deteksi zona waktu telepon

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

Ada banyak tempat di dunia dimana masalah zona waktu ini mungkin terjadi. Misalnya, Denver Colorado dan Phoenix Arizona di AS tidak dapat dibedakan menggunakan sinyal NITZ selama musim dingin, namun dapat dibedakan selama musim lainnya. Lokasi mana pun dengan zona waktu yang sama mungkin mengalami masalah seperti ini.

Tabel berikut mengelompokkan perilaku perangkat bergantung pada musim di Denver dan Phoenix sebagai contoh:

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

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

Perangkat salah disetel ke Amerika/Denver.
Denver, Colorado
Musim panas
Waktu: 1 Juli 2021 12:00:00
Negara: AS
Offset: UTC-6, musim panas
Satu ID zona cocok:
  • Amerika/Denver

Perangkat disetel dengan benar ke Amerika/Denver.
Phoenix, Arizona
Musim panas
Waktu: 1 Juli 2021 12:00:00
Negara: AS
Offset: UTC-7, tidak ada waktu musim panas
Satu ID zona cocok:
  • Amerika/Phoenix

Perangkat disetel dengan benar ke Amerika/Phoenix.

Contoh di atas 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 namun masih menampilkan waktu setempat yang tampaknya benar. Jam perangkat, kalender, dan aplikasi lain menampilkan waktu lokal yang diharapkan meskipun ID zona waktu salah karena kedua ID zona waktu menghitung waktu lokal yang sama selama musim dingin.

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

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

Debugging dan pengujian

Bagian berikut menjelaskan perintah shell untuk debugging dan menguji fitur deteksi zona waktu telepon.

Uji pengaturan lingkungan

Penguji biasanya menggunakan lingkungan pengujian dengan pengujian atau sel telepon simulasi untuk memeriksa perilaku deteksi zona waktu telepon. Sel uji dapat digunakan untuk mensimulasikan jaringan dengan MCC yang berbeda dan untuk mengirim sinyal NITZ ke perangkat dan kemudian memantau efeknya.

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

Misalnya, jika MCC yang digunakan oleh sel uji adalah untuk AS, sinyal NITZ harus berisi informasi "waktu universal", offset, dan waktu musim panas yang benar untuk suatu tempat di AS.

Berinteraksi dengan layanan com.android.phone

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

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

Ini membuang informasi telepon, yang juga dapat ditemukan dalam laporan bug Android. Pada perangkat dengan beberapa SIM, terdapat informasi untuk setiap radio SIM.

Log Zona Waktu menunjukkan saran yang dikirimkan 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")]}