Telefon saat dilimi algılama

Android 11 veya önceki sürümleri çalıştıran cihazlar için AOSP'deki otomatik saat dilimi algılama özelliği, telefon alt sisteminden gelen sinyallerden yararlanır. Telefon alt sistemine bağımlı olması nedeniyle Android 11 veya önceki sürümlerde otomatik saat dilimi algılama özelliği, telefon cihazlarıyla sınırlıdır.

Telefon saat dilimi algılama özelliği kullanılabilir olduğunda Mobil Ülke Kodu (MCC) ve Ağ Kimliği ve Saat Dilimi (NITZ) sinyallerini kullanır.

Örneğin, Fransa'daki bir cihaz, saat dilimini yalnızca yakındaki baz istasyonları tarafından bildirilen MM'ye dayanarak tanımlayabilir. Bunun nedeni, Fransa'nın tek bir saat dilimi kullandığının bilinmesidir.

Bir ülkede birden fazla saat dilimi kullanılıyorsa saat dilimini belirlemek için yalnızca MCC yeterli değildir. Bu ülkelerde cihaz, doğru saat dilimini belirlemek için NITZ sinyallerini de kullanır. Bu yöntem dünyanın birçok yerinde iyi çalışır ancak NITZ sinyallerinin hem kullanılabilir hem de doğru olması gerekir. Bu nedenle, operatörlere bağlıdır.

Telefon saat dilimi algılama özelliği, pasif bir algılayıcıdır. Bu algoritma her zaman çalışır. Bu nedenle, etkin time_zone_detector algoritması şu anda telefon değilse bile genellikle telefon önerileri yapılır.

Telefon saat dilimi algılamayla ilgili sınırlama

Doğru NITZ sinyalleri mevcut olsa bile telefon saat dilimi algılama özelliği her ülkede her zaman iyi çalışmaz. Bunun nedeni, NITZ'in yalnızca ofset ve yaz saati bilgilerini içermesidir. Bu bilgiler, bir saat dilimini benzersiz şekilde tanımlamak için her zaman yeterli değildir.

Dünyada bu saat dilimi sorununun yaşanabileceği birçok yer vardır. Örneğin, ABD'deki Denver Colorado ve Phoenix Arizona, kış aylarında NITZ sinyalleri kullanılarak ayırt edilemez ancak diğer mevsimlerde ayırt edilebilir. Benzer şekilde örtüşen saat dilimlerine sahip tüm konumlarda bu tür sorunlar yaşanabilir.

Aşağıdaki tabloda, Denver ve Phoenix'te sezona göre cihaz davranışı ayrıntılı olarak açıklanmıştır:

Konum ve sezon MCC veya NITZ'den alınan bilgiler Algılanan saat dilimi ve davranış
Denver, Colorado
Kış
Zaman: 1 Ocak 2021 12:00:00
Ülke: ABD
Ofset: UTC-7, yaz saati yok
İki bölge kimliği eşleşiyor:
  • Amerika/Denver
  • America/Phoenix

Cihaz, Amerika/Denver olarak doğru ayarlanmıştır.
Phoenix, Arizona
Kış
Zaman: 1 Ocak 2021 12:00:00
Ülke: ABD
Ofset: UTC-7, yaz saati yok
İki bölge kimliği eşleşiyor:
  • Amerika/Denver
  • America/Phoenix

Cihaz yanlış bir şekilde America/Denver olarak ayarlanmış.
Denver, Colorado
Yaz
Saat: 1 Temmuz 2021 12:00:00
Ülke: ABD
Zaman farkı: UTC-6, yaz saati uygulaması
Bir bölge kimliği eşleşiyor:
  • Amerika/Denver

Cihaz doğru olarak America/Denver olarak ayarlanmış.
Phoenix, Arizona
Yaz
Saat: 1 Temmuz 2021 12:00:00
Ülke: ABD
Ofset: UTC-7, yaz saati uygulaması yok
Bir bölge kimliği eşleşiyor:
  • America/Phoenix

Cihaz doğru olarak America/Phoenix olarak ayarlanmış.

Yukarıdaki örneklerde, Denver veya Arizona'daki Android cihazların kış aylarında iki eşleşen saat dilimi kimliğinden birini seçmesi gerektiği gösterilmektedir. Bu kimlik bazı cihazlar için yanlış olabilir ancak yerel saati doğru olarak gösterebilir. Cihaz saati, takvimler ve diğer uygulamalar, saat dilimi kimliği yanlış olsa bile kış aylarında aynı yerel saati hesapladığından beklenen yerel saati gösterir.

Ancak, Denver'da yaz saati uygulanırken Phoenix'te uygulanmadığı bahar aylarında, kullanıcının konumu için yanlış saat dilimi kimliğine ayarlanmış bazı cihazlar geçici olarak yanlış yerel saati gösterebilir. Bu durum, cihaz yeni bir NITZ sinyali (özellikle "UTC-7, yaz saati yok" ofset bilgisi içeren bir sinyal) alır almaz düzeltilir ancak bu işlem biraz zaman alabilir ve operatörlere bağlıdır.

Sonuç olarak, saat dilimi kimliğini kıştan bahara dek depolayan veya aktaran takvimler ya da diğer uygulamalar, ilgili uygulamalar saat dilimi kimliğini güncelleyene kadar yanlış yerel saati gösterebilir ve kullanabilir.

Hata ayıklama ve test

Aşağıdaki bölümde, telefon saat dilimi algılama özelliğinde hata ayıklama ve test için kullanılan kabuk komutları açıklanmaktadır.

Test ortamı kurulumu

Testçiler, telefon saat dilimi algılama davranışını kontrol etmek için genellikle test veya simüle edilmiş bir telefon hücresi içeren bir test ortamı kullanır. Test hücresi, farklı MCC'lere sahip ağları simüle etmek, cihazlara NITZ sinyalleri göndermek ve ardından bunların etkilerini izlemek için kullanılabilir.

Cihazın saat dilimini algılayabilmesi için NITZ sinyal bilgilerinin doğru, MCC ile tutarlı ve cihazın IANA TZDB (saat dilimi kuralları) kopyasıyla eşleşmesi gerekir. MM ile tutarsız olan NITZ sinyalleri, telefon algoritmasının belirsizleşmesine neden olur.

Örneğin, test hücresi tarafından kullanılan MCC ABD içinse NITZ sinyali, ABD'nin bir yerinde doğru olan bir "evrensel saat", ofset ve yaz saati bilgilerini içermelidir.

com.android.phone hizmetiyle etkileşimde bulunma

Cihazın telefon için doğru saat dilimi önerilerini aldığını doğrulamak üzere şunu kullanın:

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

Bu işlem, Android hata raporlarında da bulunan telefon bilgilerinin dökümünü alır. Birden fazla SIM kullanılan cihazlarda her SIM radyo için bilgi vardır.

Saat dilimi günlükleri, telefon işleminin time_zone_detector'a gönderdiği önerileri ve önerilerin gönderilme nedenlerini gösterir.

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