Đối với các thiết bị chạy Android 11 trở xuống, tính năng tự động phát hiện múi giờ trong AOSP dựa vào tín hiệu từ hệ thống con điện thoại. Do phụ thuộc vào hệ thống con điện thoại, nên tính năng tự động phát hiện múi giờ trên Android 11 trở xuống chỉ giới hạn ở các thiết bị điện thoại.
Khi có tính năng phát hiện múi giờ qua điện thoại, tính năng này sẽ hoạt động bằng cách sử dụng mã quốc gia di động (MCC) và tín hiệu Nhận dạng mạng và múi giờ (NITZ).
Ví dụ: một thiết bị ở Bỉ có thể xác định múi giờ chỉ dựa trên mã quốc gia (MCC) do các trạm phát sóng di động ở gần báo cáo. Điều này có thể xảy ra vì Bỉ được biết là sử dụng một múi giờ duy nhất.
Khi một quốc gia sử dụng nhiều múi giờ, chỉ MCC là không đủ để xác định múi giờ. Đối với những quốc gia này, thiết bị cũng sử dụng tín hiệu NITZ để xác định múi giờ chính xác. Điều này hoạt động hiệu quả ở nhiều nơi trên thế giới, nhưng yêu cầu là tín hiệu NITZ phải có sẵn và chính xác, do đó, tín hiệu này phụ thuộc vào nhà mạng.
Tính năng phát hiện múi giờ qua điện thoại là một công cụ phát hiện thụ động. Dịch vụ này luôn chạy, vì vậy, các đề xuất về điện thoại thường được đưa ra ngay cả khi thuật toán time_zone_detector
đang hoạt động không phải là điện thoại.
Hạn chế của tính năng phát hiện múi giờ qua điện thoại
Ngay cả khi có sẵn các tín hiệu NITZ chính xác, tính năng phát hiện múi giờ của điện thoại không phải lúc nào cũng hoạt động tốt ở mọi quốc gia. Điều này là do NITZ chỉ chứa thông tin về độ lệch và giờ tiết kiệm ánh sáng ban ngày, không phải lúc nào cũng đủ để xác định duy nhất một múi giờ.
Có nhiều nơi trên thế giới có thể gặp phải vấn đề về múi giờ này. Ví dụ: Denver, Colorado và Phoenix, Arizona ở Hoa Kỳ không thể phân biệt được bằng tín hiệu NITZ vào mùa đông, nhưng có thể phân biệt được vào các mùa khác. Mọi vị trí có múi giờ tương tự và chồng chéo đều có thể gặp phải loại vấn đề này.
Bảng sau đây trình bày chi tiết hành vi của thiết bị tuỳ thuộc vào mùa đối với Denver và Phoenix làm ví dụ:
Vị trí và mùa | Thông tin từ MCC hoặc NITZ | Múi giờ và hành vi được phát hiện |
---|---|---|
Denver, Colorado Mùa đông |
Thời gian: 12:00:00 ngày 1 tháng 1 năm 2021 Quốc gia: Hoa Kỳ Múi giờ: UTC-7, không theo giờ tiết kiệm ánh sáng ban ngày |
Hai mã khu vực trùng khớp:
Thiết bị được đặt chính xác thành America/Denver. |
Phoenix, Arizona Mùa đông |
Thời gian: 12:00:00 ngày 1 tháng 1 năm 2021 Quốc gia: Hoa Kỳ Múi giờ: UTC-7, không theo giờ tiết kiệm ánh sáng ban ngày |
Hai mã khu vực trùng khớp:
Thiết bị được đặt không chính xác thành America/Denver. |
Denver, Colorado Mùa hè |
Thời gian: 12:00:00 ngày 1 tháng 7 năm 2021 Quốc gia: Hoa Kỳ Múi giờ: UTC-6, giờ tiết kiệm ánh sáng ban ngày |
Một mã nhận dạng khu vực trùng khớp:
Thiết bị được đặt chính xác thành America/Denver. |
Phoenix, Arizona Mùa hè |
Thời gian: 12:00:00 ngày 1 tháng 7 năm 2021 Quốc gia: Hoa Kỳ Múi giờ: UTC-7, không theo giờ tiết kiệm ánh sáng ban ngày |
Một mã nhận dạng khu vực trùng khớp:
Thiết bị được đặt chính xác thành America/Phoenix. |
Các ví dụ trong bảng cho thấy rằng vào mùa đông, các thiết bị Android ở Denver hoặc Arizona phải chọn một trong hai mã nhận dạng múi giờ trùng khớp. Mã này có thể không chính xác đối với một số thiết bị nhưng vẫn hiển thị thời gian địa phương có vẻ chính xác. Đồng hồ, lịch và các ứng dụng khác trên thiết bị sẽ hiển thị thời gian địa phương dự kiến ngay cả khi mã nhận dạng múi giờ không chính xác vì cả hai mã nhận dạng múi giờ đều tính toán cùng một thời gian địa phương trong mùa đông.
Tuy nhiên, vào mùa xuân khi Denver áp dụng giờ tiết kiệm ánh sáng ban ngày và Phoenix thì không, một số thiết bị có thể tạm thời hiển thị sai giờ địa phương nếu được đặt thành mã nhận dạng múi giờ không chính xác cho vị trí của người dùng. Vấn đề này sẽ được khắc phục ngay khi thiết bị nhận được tín hiệu NITZ mới (cụ thể là tín hiệu có chứa thông tin về độ lệch "UTC-7, không có giờ tiết kiệm ánh sáng ban ngày"), nhưng có thể mất một khoảng thời gian và phụ thuộc vào nhà mạng.
Do đó, lịch hoặc các ứng dụng khác lưu trữ hoặc chuyển mã nhận dạng múi giờ từ mùa đông sang mùa xuân có thể hiển thị và sử dụng sai giờ địa phương cho đến khi các ứng dụng có liên quan cập nhật mã nhận dạng múi giờ.
Gỡ lỗi và thử nghiệm
Phần sau đây mô tả các lệnh shell để gỡ lỗi và kiểm thử tính năng phát hiện múi giờ của điện thoại.
Thiết lập môi trường kiểm thử
Người kiểm thử thường sử dụng một môi trường kiểm thử có ô điện thoại kiểm thử hoặc mô phỏng để kiểm tra hành vi phát hiện múi giờ của điện thoại. Ô kiểm thử có thể được dùng để mô phỏng các mạng có nhiều MCC và gửi tín hiệu NITZ đến các thiết bị, sau đó theo dõi hiệu ứng của các tín hiệu này.
Để thiết bị phát hiện múi giờ, thông tin tín hiệu NITZ phải chính xác, nhất quán với MCC và khớp với bản sao TZDB (quy tắc múi giờ) của IANA trên thiết bị. Các tín hiệu NITZ không nhất quán với MCC khiến thuật toán điện thoại trở nên không chắc chắn.
Ví dụ: nếu MCC mà ô kiểm thử sử dụng là của Hoa Kỳ, thì tín hiệu NITZ phải chứa thông tin về giờ UTC, độ lệch và giờ tiết kiệm ánh sáng ban ngày chính xác cho một nơi nào đó ở Hoa Kỳ.
Tương tác với dịch vụ com.android.phone
Để xác minh rằng thiết bị đang nhận được các đề xuất múi giờ chính xác của điện thoại, hãy sử dụng:
adb shell dumpsys activity service \
com.android.phone/com.android.phone.TelephonyDebugService
Thao tác này sẽ kết xuất thông tin về điện thoại và bạn cũng có thể tìm thấy thông tin này trong các báo cáo lỗi của Android. Trên các thiết bị có nhiều SIM, sẽ có thông tin cho từng đài SIM.
Nhật ký múi giờ cho biết những đề xuất mà quy trình điện thoại đã gửi đến time_zone_detector và lý do gửi các đề xuất đó.
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")]}