Detecção de fuso horário de telefonia

Para dispositivos com Android 11 ou inferior, a detecção automática de fuso horário no AOSP depende de sinais do subsistema de telefonia. Devido à dependência do subsistema de telefonia, a detecção automática de fuso horário no Android 11 ou inferior está limitada a dispositivos de telefonia.

Quando a detecção de fuso horário de telefonia está disponível, ela funciona usando os sinais Mobile Country Code (MCC) e Network Identity and Time Zone (NITZ) .

Por exemplo, um dispositivo na França pode identificar o fuso horário com base apenas no MCC informado pelas torres de celular próximas. Isto é possível porque se sabe que a França usa um único fuso horário.

Quando um país utiliza vários fusos horários, o MCC por si só não é suficiente para identificar o fuso horário. Para estes países, o dispositivo também utiliza sinais NITZ para identificar o fuso horário correto. Isto funciona bem em muitos lugares ao redor do mundo, mas exige que os sinais NITZ estejam disponíveis e corretos e, portanto, depende das operadoras.

A detecção de fuso horário de telefonia é um detector passivo . Ele é executado o tempo todo e, portanto, sugestões de telefonia são frequentemente feitas mesmo quando o algoritmo time_zone_detector ativo não é de telefonia no momento.

Limitação da detecção de fuso horário de telefonia

Mesmo com sinais NITZ corretos disponíveis, a detecção de fuso horário de telefonia nem sempre funciona bem em todos os países. Isso ocorre porque o NITZ contém apenas informações de deslocamento e horário de verão, que nem sempre são suficientes para identificar exclusivamente um fuso horário.

Existem muitos lugares no mundo onde esse problema de fuso horário pode ocorrer. Por exemplo, Denver Colorado e Phoenix Arizona, nos EUA, não podem ser distinguidas usando sinais NITZ durante o inverno, mas podem durante outras estações. Qualquer local com fusos horários sobrepostos semelhantes pode enfrentar esse tipo de problema.

A tabela a seguir detalha o comportamento do dispositivo dependendo da temporada para Denver e Phoenix, por exemplo:

Localização e temporada Informações do MCC ou NITZ Fuso horário e comportamento detectados
Denver, Colorado
Inverno
Hora: 1º de janeiro de 2021 12:00:00
País: EUA
Compensação: UTC-7, sem horário de verão
Dois IDs de zona correspondem:
  • América/Denver
  • América/Fênix

O dispositivo está configurado corretamente para América/Denver.
Fênix, Arizona
Inverno
Hora: 1º de janeiro de 2021 12:00:00
País: EUA
Compensação: UTC-7, sem horário de verão
Dois IDs de zona correspondem:
  • América/Denver
  • América/Fênix

O dispositivo está configurado incorretamente para América/Denver.
Denver, Colorado
Verão
Hora: 1º de julho de 2021 12:00:00
País: EUA
Compensação: UTC-6, horário de verão
Um ID de zona corresponde a:
  • América/Denver

O dispositivo está configurado corretamente para América/Denver.
Fênix, Arizona
Verão
Hora: 1º de julho de 2021 12:00:00
País: EUA
Compensação: UTC-7, sem horário de verão
Um ID de zona corresponde a:
  • América/Fênix

O dispositivo está configurado corretamente para América/Phoenix.

Os exemplos acima mostram que durante o inverno, os dispositivos Android em Denver ou Arizona devem escolher um dos dois IDs de fuso horário correspondentes, que podem estar incorretos para alguns dispositivos, mas ainda exibem uma hora local aparentemente correta. O relógio do dispositivo, os calendários e outros aplicativos exibem a hora local esperada, mesmo que o ID do fuso horário esteja incorreto, porque ambos os IDs de fuso horário calculam a mesma hora local durante o inverno.

No entanto, na primavera, quando Denver observa o horário de verão e Phoenix não, alguns dispositivos podem mostrar temporariamente a hora local incorreta se estiverem configurados com o ID de fuso horário errado para a localização do usuário. Isso é corrigido assim que o dispositivo recebe um novo sinal NITZ (especificamente, um que contém informações de compensação "UTC-7, sem horário de verão"), mas isso pode levar algum tempo e depende das operadoras.

Como resultado, calendários ou outros aplicativos que armazenam ou transferem o ID do fuso horário do inverno para a primavera podem exibir e usar a hora local errada até que os aplicativos relevantes atualizem o ID do fuso horário.

Depuração e teste

A seção a seguir descreve comandos shell para depuração e teste do recurso de detecção de fuso horário de telefonia.

Configuração do ambiente de teste

Os testadores normalmente usam um ambiente de teste com uma célula de telefonia simulada ou de teste para verificar o comportamento de detecção do fuso horário da telefonia. A célula de teste pode ser usada para simular redes com diferentes CCMs e para enviar sinais NITZ aos dispositivos e então monitorar seus efeitos.

Para que o dispositivo detecte o fuso horário, as informações do sinal NITZ devem estar corretas, consistentes com o MCC e corresponder à cópia do IANA TZDB (regras de fuso horário) do dispositivo. Os sinais NITZ que são inconsistentes com o MCC fazem com que o algoritmo de telefonia fique incerto.

Por exemplo, se o CCM usado pela célula de teste for para os EUA, o sinal NITZ deverá conter um "horário universal", deslocamento e informações de horário de verão que sejam corretos para algum lugar nos EUA.

Interagindo com o serviço com.android.phone

Para verificar se o dispositivo está recebendo sugestões corretas de fuso horário de telefonia, use:

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

Isso despeja informações de telefonia, que também podem ser encontradas em relatórios de bugs do Android. Em dispositivos com múltiplos SIMs, há informações para cada rádio SIM.

Os Logs de fuso horário mostram as sugestões que o processo de telefonia enviou ao time_zone_detector e os motivos do envio das sugestões.

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