การตรวจจับโซนเวลาโทรศัพท์

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

เมื่อการตรวจจับเขตเวลาโทรศัพท์พร้อมใช้งาน ระบบจะทำงานโดยใช้สัญญาณ Mobile Country Code (MCC) และ Network Identity and Time Zone (NITZ)

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

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

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

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

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

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

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

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

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

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

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

อุปกรณ์ได้รับการตั้งค่า อย่างถูกต้อง เป็น America/Phoenix

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

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

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

การดีบักและการทดสอบ

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

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

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