Android 11 veya daha eski sürümleri çalıştıran cihazlarda AOSP'deki otomatik saat dilimi algılama, telefon alt sisteminden gelen sinyalleri kullanı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 MCC'ye göre belirleyebilir. 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, 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ılama sınırlaması
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 için 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:
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:
Cihaz, yanlışlıkla Amerika/Denver olarak ayarlanmış. |
Denver, Colorado Yaz |
Zaman: 1 Temmuz 2021 12:00:00 Ülke: ABD Ofset: UTC-6, yaz saati |
Bir bölge kimliği eşleşti:
Cihaz, Amerika/Denver olarak doğru ayarlanmıştır. |
Phoenix, Arizona Yaz |
Zaman: 1 Temmuz 2021 12:00:00 Ülke: ABD Ofset: UTC-7, yaz saati uygulaması yok |
Bir bölge kimliği eşleşti:
Cihaz, Amerika/Phoenix olarak doğru şekilde ayarlanmıştır. |
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öre 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 doğru telefon saat dilimi önerileri aldığını doğrulamak için şunları kullanın:
adb shell dumpsys activity service \
com.android.phone/com.android.phone.TelephonyDebugService
Bu, Android hata raporlarında da bulunabilen telefon bilgileri dökümüdür. Birden fazla SIM'i olan cihazlarda her SIM radyosuyla ilgili bilgiler bulunur.
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")]}