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

สำหรับอุปกรณ์ที่ใช้ 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 น.
ประเทศ: US
ออฟเซ็ต: UTC-7 ไม่มีการออมแสง
รหัสโซนสองตรงกัน:
  • อเมริกา/เดนเวอร์
  • อเมริกา/ฟีนิกซ์

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

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

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

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

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

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

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

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

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

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

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