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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ผู้ทดสอบมักจะใช้สภาพแวดล้อมการทดสอบที่มีการทดสอบหรือเซลล์โทรศัพท์จำลอง เพื่อตรวจสอบลักษณะการตรวจหาเขตเวลาของโทรศัพท์ เซลล์ทดสอบสามารถใช้เพื่อ จำลองเครือข่ายด้วย 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")]}