전화 통신 시간대 감지

Android 11 이하를 실행하는 기기의 경우 AOSP의 자동 시간대 감지는 전화 통신 하위 시스템의 신호에 의존합니다. 전화 통신 하위 시스템에 대한 종속성으로 인해 Android 11 이하에서 자동 시간대 감지는 전화 통신 기기로 제한됩니다.

전화 통신 시간대 감지를 사용할 수 있는 경우 MCC(모바일 국가 코드)NITZ(네트워크 ID 및 시간대) 신호를 사용하여 작동합니다.

예를 들어, 프랑스의 장치는 인근 기지국에서 보고한 MCC만을 기반으로 시간대를 식별할 수 있습니다. 이것은 프랑스가 단일 시간대를 사용하는 것으로 알려져 있기 때문에 가능합니다.

국가에서 여러 시간대를 사용하는 경우 MCC만으로는 시간대를 식별하기에 충분하지 않습니다. 이러한 국가의 경우 장치는 NITZ 신호를 사용하여 올바른 시간대도 식별합니다. 이것은 전 세계 여러 곳에서 잘 작동하지만 NITZ 신호가 사용 가능하고 정확해야 하므로 통신 사업자에 따라 다릅니다.

전화 통신 시간대 감지는 수동 감지기입니다. 항상 실행되므로 time_zone_detector 출처가 현재 전화 통신이 아닌 경우에도 전화 통신 제안이 자주 만들어집니다.

전화 시간대 감지의 한계

사용 가능한 올바른 NITZ 신호가 있더라도 전화 통신 시간대 감지가 모든 국가에서 항상 제대로 작동하는 것은 아닙니다. NITZ에는 오프셋 및 일광 절약 시간 정보만 포함되어 있어 표준 시간대를 고유하게 식별하는 데 항상 충분하지 않기 때문입니다.

이 시간대 문제가 발생할 수 있는 곳은 세계 여러 곳입니다. 예를 들어 미국의 Denver Colorado와 Phoenix Arizona는 겨울에는 NITZ 신호를 사용하여 구분할 수 없지만 다른 계절에는 구분할 수 있습니다. 유사하게 겹치는 시간대가 있는 모든 위치에서 이러한 종류의 문제가 발생할 수 있습니다.

다음 표는 예를 들어 Denver 및 Phoenix의 계절에 따른 장치 동작을 분류합니다.

위치와 계절 MCC 또는 NITZ의 정보 감지된 시간대 및 동작
콜로라도주 덴버
겨울
시간: 2021년 1월 1일 12:00:00
국가: 미국
오프셋: UTC-7, 일광 절약 시간제 없음
두 개의 영역 ID가 일치합니다.
  • 미국/덴버
  • 아메리카/피닉스

장치가 America/Denver로 올바르게 설정되어 있습니다.
피닉스, 애리조나
겨울
시간: 2021년 1월 1일 12:00:00
국가: 미국
오프셋: UTC-7, 일광 절약 시간제 없음
두 개의 영역 ID가 일치합니다.
  • 미국/덴버
  • 아메리카/피닉스

기기가 America/Denver로 잘못 설정되었습니다.
콜로라도주 덴버
여름
시간: 2021년 7월 1일 12:00:00
국가: 미국
오프셋: UTC-6, 일광 절약 시간제
하나의 영역 ID는 다음과 일치합니다.
  • 미국/덴버

장치가 America/Denver로 올바르게 설정되어 있습니다.
피닉스, 애리조나
여름
시간: 2021년 7월 1일 12:00:00
국가: 미국
오프셋: UTC-7, 일광 절약 시간제 없음
하나의 영역 ID는 다음과 일치합니다.
  • 아메리카/피닉스

장치가 America/Phoenix로 올바르게 설정되어 있습니다.

위의 예는 겨울 동안 덴버 또는 애리조나의 Android 기기가 일치하는 두 개의 시간대 ID 중 하나를 선택해야 한다는 것을 보여줍니다. 일부 기기에서는 올바르지 않을 수 있지만 여전히 분명히 정확한 현지 시간을 표시합니다. 장치 시계, 캘린더 및 기타 앱은 표준 시간대 ID가 올바르지 않더라도 겨울 동안 동일한 현지 시간을 계산하기 때문에 예상 현지 시간을 표시합니다.

그러나 Denver가 일광 절약 시간제를 준수하고 Phoenix가 준수하지 않는 봄에 일부 장치는 사용자 위치에 대해 잘못된 시간대 ID로 설정된 경우 일시적으로 잘못된 현지 시간을 표시할 수 있습니다. 이것은 장치가 새로운 NITZ 신호(특히 "UTC-7, 일광 절약 시간 없음" 오프셋 정보를 포함하는 신호)를 수신하는 즉시 수정되지만 이는 시간이 걸릴 수 있으며 이동통신사에 따라 다릅니다.

결과적으로 겨울에서 봄까지 시간대 ID를 저장하거나 이월하는 캘린더 또는 기타 앱은 관련 앱이 시간대 ID를 업데이트할 때까지 잘못된 현지 시간을 표시하고 사용할 수 있습니다.

디버깅 및 테스트

다음 섹션에서는 전화 통신 시간대 감지 기능을 디버깅하고 테스트하기 위한 셸 명령에 대해 설명합니다.

테스트 환경 설정

테스터는 일반적으로 테스트 또는 시뮬레이션된 전화 통신 셀이 있는 테스트 환경을 사용하여 전화 통신 시간대 감지 동작을 확인합니다. 테스트 셀을 사용하여 다른 MCC가 있는 네트워크를 시뮬레이션하고 NITZ 신호를 장치에 보낸 다음 그 효과를 모니터링할 수 있습니다.

장치가 시간대를 감지하려면 NITZ 신호 정보가 정확하고 MCC와 일치해야 하며 장치의 IANA TZDB 사본(시간대 규칙)과 일치해야 합니다. MCC와 일치하지 않는 NITZ 신호는 전화 통신 출처를 불확실하게 만듭니다.

예를 들어 테스트 셀에서 사용하는 MCC가 미국용인 경우 NITZ 신호에는 미국 어딘가에 맞는 "세계 시간", 오프셋 및 일광 절약 시간 정보가 포함되어야 합니다.

com.android.phone 서비스와 상호 작용

장치가 올바른 전화 통신 시간대 제안을 수신하는지 확인하려면 다음을 사용하십시오.

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

Android 버그 보고서에서도 찾을 수 있는 전화 통신 정보를 덤프합니다. 여러 SIM이 있는 기기에는 각 SIM 라디오에 대한 정보가 있습니다.

시간대 로그 는 전화 통신 프로세스가 time_zone_detector에 보낸 제안과 제안을 보내는 이유를 보여줍니다.

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