การตรวจหาเขตเวลาของโทรศัพท์

สำหรับอุปกรณ์ที่ใช้ Android 11 หรือต่ำกว่า การตรวจหาเขตเวลาอัตโนมัติใน AOSP จะอาศัยสัญญาณจากระบบย่อยโทรศัพท์ การตรวจหาเขตเวลาอัตโนมัติใน Android 11 หรือต่ำกว่าจะจำกัดไว้สำหรับอุปกรณ์โทรคมนาคมเท่านั้น เนื่องจากต้องอาศัยระบบย่อยการโทร

เมื่อการตรวจหาเขตเวลาทางโทรศัพท์พร้อมใช้งาน ฟีเจอร์นี้จะทำงานโดยใช้สัญญาณรหัสประเทศของอุปกรณ์เคลื่อนที่ (MCC) และข้อมูลประจำตัวเครือข่ายและเขตเวลา (NITZ)

เช่น อุปกรณ์ในฝรั่งเศสสามารถระบุเขตเวลาตาม MCC ที่รายงานโดยหอคอยมือถือที่อยู่ใกล้เคียงเท่านั้น ซึ่งเป็นไปได้เนื่องจากฝรั่งเศสขึ้นชื่อว่าใช้เขตเวลาเดียว

เมื่อประเทศหนึ่งใช้เขตเวลาหลายเขต MCC เพียงอย่างเดียวไม่เพียงพอต่อการระบุเขตเวลา สำหรับประเทศเหล่านี้ อุปกรณ์จะใช้สัญญาณ NITZ เพื่อระบุเขตเวลาที่ถูกต้องด้วย วิธีนี้ใช้ได้กับหลายพื้นที่ทั่วโลก แต่สัญญาณ NITZ ต้องพร้อมใช้งานและถูกต้อง จึงขึ้นอยู่กับผู้ให้บริการ

การตรวจหาเขตเวลาของโทรศัพท์เป็นเครื่องมือตรวจจับแบบไม่โต้ตอบ อัลกอริทึมนี้ทํางานอยู่ตลอดเวลา ดังนั้นจึงมักแสดงคําแนะนําการโทรแม้ว่าอัลกอริทึม time_zone_detector ที่ใช้งานอยู่จะไม่ใช่การโทร

ข้อจํากัดของการตรวจหาเขตเวลาทางโทรศัพท์

แม้ว่าจะมีสัญญาณ NITZ ที่ถูกต้อง แต่การตรวจหาเขตเวลาทางโทรศัพท์อาจไม่ทำงานอย่างถูกต้องเสมอไปในทุกประเทศ เนื่องจาก NITZ มีเฉพาะข้อมูลเวลาออมแสงและเวลาออฟเซ็ต ซึ่งไม่เพียงพอที่จะระบุเขตเวลาได้อย่างไม่ซ้ำกันเสมอไป

ปัญหาเขตเวลานี้อาจเกิดขึ้นได้หลายแห่งในโลก ตัวอย่างเช่น ไม่สามารถแยกแยะเดนเวอร์ โคโลราโดและฟีนิกซ์ แอริโซนาในสหรัฐอเมริกาโดยใช้สัญญาณ NITZ ในช่วงฤดูหนาว แต่สามารถแยกแยะได้ในช่วงอื่นๆ สถานที่ที่มีเขตเวลาที่ทับซ้อนกันคล้ายๆ กันอาจพบปัญหาประเภทนี้

ตารางต่อไปนี้แสดงรายละเอียดลักษณะการทํางานของอุปกรณ์ตามฤดูกาลสำหรับเดนเวอร์และฟีนิกซ์

สถานที่ตั้งและฤดูกาล ข้อมูลจาก MCC หรือ NITZ เขตเวลาและลักษณะการทำงานที่ตรวจพบ
เดนเวอร์ รัฐโคโลราโด
ฤดูหนาว
เวลา: 1 มกราคม 2021 12:00:00
ประเทศ: สหรัฐอเมริกา
เวลาออฟเซ็ต: UTC-7, ไม่มีเวลาออมแสง
รหัสโซน 2 รายการตรงกัน
  • อเมริกา/เดนเวอร์
  • อเมริกา/ฟีนิกซ์

อุปกรณ์ตั้งค่าเป็นอเมริกา/เดนเวอร์อย่างถูกต้อง
ฟีนิกซ์ รัฐแอริโซนา
ฤดูหนาว
เวลา: 1 มกราคม 2021 12:00:00
ประเทศ: สหรัฐอเมริกา
เวลาออฟเซ็ต: UTC-7, ไม่มีเวลาออมแสง
รหัสโซน 2 รายการตรงกัน
  • อเมริกา/เดนเวอร์
  • อเมริกา/ฟีนิกซ์

อุปกรณ์ตั้งค่าเป็นอเมริกา/เดนเวอร์ไม่ถูกต้อง
เดนเวอร์ รัฐโคโลราโด
ฤดูร้อน
เวลา: 1 กรกฎาคม 2021 12:00:00
ประเทศ: สหรัฐอเมริกา
เวลาออฟเซ็ต: UTC-6, เวลาออมแสง
รหัสโซน 1 รายการที่ตรงกัน
  • อเมริกา/เดนเวอร์

อุปกรณ์ตั้งค่าเป็นอเมริกา/เดนเวอร์อย่างถูกต้อง
ฟีนิกซ์ แอริโซนา
ฤดูร้อน
เวลา: 1 กรกฎาคม 2021 เวลา 12:00:00
ประเทศ: สหรัฐอเมริกา
เวลาออมแสง: UTC-7 ไม่มีเวลาออมแสง
รหัสโซน 1 รายการที่ตรงกัน
  • อเมริกา/ฟีนิกซ์

อุปกรณ์ตั้งค่าเป็นอเมริกา/ฟีนิกซ์อย่างถูกต้อง

ตัวอย่างข้างต้นแสดงให้เห็นว่าในช่วงฤดูหนาว อุปกรณ์ Android ในเดนเวอร์หรือแอริโซนาต้องเลือกรหัสเขตเวลาใดรหัสเวลาหนึ่งจาก 2 รหัสที่ตรงกัน ซึ่งอาจไม่ถูกต้องสำหรับอุปกรณ์บางเครื่อง แต่ยังคงแสดงเวลาท้องถิ่นที่ถูกต้อง นาฬิกา ปฏิทิน และแอปอื่นๆ ของอุปกรณ์จะแสดงเวลาท้องถิ่นตามที่คาดไว้แม้ว่ารหัสเขตเวลาจะไม่ถูกต้อง เนื่องจากรหัสเขตเวลาทั้ง 2 รหัสจะคำนวณเวลาท้องถิ่นเดียวกันในช่วงฤดูหนาว

อย่างไรก็ตาม ในฤดูใบไม้ผลิเมื่อเดนเวอร์ใช้เวลาออมแสงและฟีนิกซ์ไม่ได้ใช้ อุปกรณ์บางเครื่องอาจแสดงเวลาท้องถิ่นที่ไม่ถูกต้องชั่วคราวหากตั้งค่ารหัสเขตเวลาไม่ถูกต้องสำหรับตำแหน่งของผู้ใช้ ระบบจะแก้ไขทันทีที่อุปกรณ์ได้รับสัญญาณ NITZ ใหม่ (โดยเฉพาะสัญญาณที่มีข้อมูลออฟเซ็ต "UTC-7, no daylight savings") แต่อาจใช้เวลาสักครู่และขึ้นอยู่กับผู้ให้บริการ

ด้วยเหตุนี้ ปฏิทินหรือแอปอื่นๆ ที่เก็บหรือส่งต่อรหัสเขตเวลาจากฤดูหนาวไปยังฤดูใบไม้ผลิจึงอาจแสดงและใช้เวลาท้องถิ่นที่ไม่ถูกต้องจนกว่าแอปที่เกี่ยวข้องจะอัปเดตรหัสเขตเวลา

การแก้ไขข้อบกพร่องและการทดสอบ

ส่วนต่อไปนี้อธิบายคำสั่งเชลล์สำหรับการแก้ไขข้อบกพร่องและการทดสอบฟีเจอร์การตรวจหาเขตเวลาของโทรศัพท์

การตั้งค่าสภาพแวดล้อมการทดสอบ

โดยปกติแล้ว ผู้ทดสอบจะใช้สภาพแวดล้อมการทดสอบที่มีเซลล์โทรศัพท์จำลองหรือทดสอบเพื่อตรวจสอบลักษณะการทํางานของการตรวจหาเขตเวลาของโทรศัพท์ เซลล์ทดสอบสามารถใช้เพื่อจำลองเครือข่ายที่มี MCC ที่แตกต่างกัน และส่งสัญญาณ NITZ ไปยังอุปกรณ์ จากนั้นตรวจสอบผลลัพธ์

ข้อมูลสัญญาณ NITZ ต้องถูกต้อง สอดคล้องกับ MCC และตรงกับสําเนา IANA TZDB (กฎเขตเวลา) ของอุปกรณ์เพื่อให้อุปกรณ์ตรวจจับเขตเวลาได้ สัญญาณ NITZ ที่ไม่สอดคล้องกับ MCC ทําให้อัลกอริทึมโทรศัพท์ไม่แน่นอน

ตัวอย่างเช่น หาก MCC ที่เซลล์ทดสอบใช้อยู่เป็นของสหรัฐอเมริกา สัญญาณ NITZ ต้องมีข้อมูล "เวลาสากล" ออฟเซ็ต และเวลาออมแสงที่ถูกต้องสำหรับสถานที่หนึ่งในสหรัฐอเมริกา

โต้ตอบกับบริการ com.android.phone

หากต้องการยืนยันว่าอุปกรณ์ได้รับคำแนะนำเขตเวลาการโทรที่ถูกต้อง ให้ใช้

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

ซึ่งจะแสดงข้อมูลการโทร ซึ่งดูได้ในรายงานข้อบกพร่องของ Android ในอุปกรณ์ที่มีซิมหลายใบ จะมีข้อมูลของวิทยุซิมแต่ละตัว

บันทึกเขตเวลาจะแสดงคําแนะนําที่กระบวนการโทรศัพท์ส่งไปยัง 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")]}