Telefon Saat Dilimi Algılama

Android 11 veya daha eski sürümleri çalıştıran cihazlar için, AOSP'deki otomatik saat dilimi algılaması, telefon alt sisteminden gelen sinyallere dayanır. Telefon alt sistemine bağımlılık nedeniyle, Android 11 veya önceki sürümlerde otomatik saat dilimi algılaması telefon cihazlarıyla sınırlıdır.

Telefon zaman dilimi algılaması mevcut olduğunda, Mobil Ülke Kodu (MCC) ve Ağ Kimliği ve Saat Dilimi (NITZ) sinyallerini kullanarak çalışır.

Örneğin, Fransa'daki bir cihaz, yalnızca yakındaki baz istasyonları tarafından bildirilen MM'ye dayalı olarak saat dilimini tanımlayabilir. Bu mümkündür, çünkü Fransa'nın tek bir zaman dilimi kullandığı bilinmektedir.

Bir ülke birden çok saat dilimi kullandığında, saat dilimini tanımlamak için tek başına MM yeterli değildir. Bu ülkeler için cihaz, doğru saat dilimini belirlemek için NITZ sinyallerini de kullanır. Bu, dünyanın birçok yerinde iyi çalışır ancak NITZ sinyallerinin hem kullanılabilir hem de doğru olmasını gerektirir ve bu nedenle taşıyıcılara bağlıdır.

Telefon zaman dilimi algılaması pasif bir dedektördür. Her zaman çalışır ve bu nedenle, time_zone_detector orijini şu anda telefon olmadığında bile telefon önerileri genellikle yapılır.

Telefon zaman dilimi algılamasının sınırlandırılması

Doğru NITZ sinyalleri mevcut olsa bile, telefonun saat dilimi algılaması her ülkede her zaman iyi çalışmaz. Bunun nedeni, NITZ'nin yalnızca bir saat dilimini benzersiz şekilde tanımlamak için her zaman yeterli olmayan ofset ve gün ışığından yararlanma bilgilerini içermesidir.

Dünyada bu saat dilimi sorununun ortaya çıkabileceği birçok yer var. Ö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 çakışan saat dilimlerine sahip herhangi bir konum, bu tür bir sorunla karşılaşabilir.

Aşağıdaki tablo, örnek olarak Denver ve Phoenix için mevsime bağlı olarak cihaz davranışını gösterir:

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

Cihaz doğru şekilde America/Denver'a ayarlanmıştır.
Phoenix, Arizona
Kış mevsimi
Zaman: 1 Ocak 2021 12:00:00
Ülke: ABD
Ofset: UTC-7, gün ışığından yararlanma yok
İki bölge kimliği eşleşiyor:
  • Amerika/Denver
  • Amerika/Phoenix

Cihaz yanlış Amerika/Denver olarak ayarlanmış.
Denver, Colorado
Yaz
Zaman: 1 Temmuz 2021 12:00:00
Ülke: ABD
Ofset: UTC-6, gün ışığından yararlanma
Bir bölge kimliği aşağıdakilerle eşleşir:
  • Amerika/Denver

Cihaz doğru şekilde America/Denver'a ayarlanmıştır.
Phoenix, Arizona
Yaz
Zaman: 1 Temmuz 2021 12:00:00
Ülke: ABD
Ofset: UTC-7, gün ışığından yararlanma yok
Bir bölge kimliği aşağıdakilerle eşleşir:
  • Amerika/Phoenix

Cihaz doğru şekilde America/Phoenix'e ayarlanmıştır.

Yukarıdaki örnekler kış aylarında Denver veya Arizona'daki Android cihazlarının eşleşen iki saat dilimi kimliğinden birini seçmesi gerektiğini göstermektedir; bu, bazı cihazlar için yanlış olabilir, ancak yine de görünüşte doğru bir yerel saati gösterir. Her iki saat dilimi kimliği de kış aylarında aynı yerel saati hesapladığından, saat dilimi kimliği yanlış olsa bile cihaz saati, takvimler ve diğer uygulamalar beklenen yerel saati görüntüler.

Ancak, ilkbaharda Denver yaz saatini gözlemlediğinde ve Phoenix bunu yapmadığında, kullanıcının konumu için yanlış saat dilimi kimliğine ayarlandıkları takdirde bazı cihazlar geçici olarak yanlış yerel saati gösterebilir. Bu, cihaz yeni bir NITZ sinyali (özellikle "UTC-7, gün ışığından yararlanma yok" ofset bilgisi içeren bir sinyal) alır almaz düzeltilir, ancak bu biraz zaman alabilir ve taşıyıcılara bağlıdır.

Sonuç olarak, saat dilimi kimliğini kıştan ilkbahara kadar saklayan veya taşıyan takvimler veya diğer uygulamalar, ilgili uygulamalar saat dilimi kimliğini güncelleyene kadar yanlış yerel saati görüntüleyebilir ve kullanabilir.

Hata ayıklama ve test etme

Aşağıdaki bölüm, telefon saat dilimi algılama özelliğinin hatalarını ayıklamak ve test etmek için kabuk komutlarını açıklar.

Test ortamı kurulumu

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

Cihazın saat dilimini algılaması için NITZ sinyal bilgisi doğru, MCC ile tutarlı ve cihazın IANA TZDB (zaman dilimi kuralları) kopyasıyla eşleşmelidir. MCC ile tutarsız olan NITZ sinyalleri, telefon kaynağının belirsiz hale gelmesine neden olur.

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

com.android.phone hizmetiyle etkileşim kurma

Aygıtın doğru telefon saat dilimi önerilerini aldığını doğrulamak için şunu kullanın:

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

Bu, Android hata raporlarında da bulunabilen telefon bilgilerini döker. Birden fazla SIM'i olan cihazlarda, her bir SIM telsizi için bilgi 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")]}