本頁面說明 Android 如何偵測時間和時區。包括 Android 如何自動偵測時間和時區、裝置製造商的設定選項,以及測試資訊。
時間和時區總覽
為判斷使用者的當地時間,以便顯示在狀態列等位置,Android 會追蹤兩個相關但獨立的狀態:
- 目前的 Unix 紀元時間
- 目前時區
目前的 Unix 紀元時間和時區是裝置全域狀態,也就是說,裝置的所有使用者都會共用這些狀態。
目前的 Unix 紀元時間並非固定值。系統會自動更新,反映時間流逝。除了正常時間流逝外,如果裝置的目前 Unix 紀元時間不正確 (例如裝置斷電後),系統也會進行調整。
系統會根據目前的時區進行調整,將目前的 Unix Epoch 時間轉換為當地時間。舉例來說,在洛杉磯的夏季,裝置會從目前的 Unix 紀元時間減去 7 小時,冬季則減去 8 小時。
為支援這些當地時間計算,所有 Android 裝置都有全球時區規則資料庫。如要進一步瞭解時區規則,請參閱時區規則。
使用者前往不同時區的新地點時,不需要調整目前的 Unix 紀元時間,但使用者通常希望看到當地時間,而不是先前所在位置的時間。變更目前的時區可確保系統將正確的時差套用至目前的 Unix Epoch 時間,以顯示新地點的正確當地時間。
AOSP 允許使用者透過下列機制,獨立控管是否自動設定時間和時區。
- 自動偵測時間:確保裝置的 Unix 紀元時間正確無誤。
- 自動偵測時區:確保裝置的目前時區正確無誤。
自動偵測時間
本節概述 time_detector
服務,這項服務可管理自動時間偵測、使用者控制項、設定選項和測試詳細資料。
time_detector 服務
time_detector
服務會出現在搭載 Android 10 以上版本的裝置上,負責管理自動時間偵測功能。啟用自動時間偵測功能後,系統會視需要調整裝置目前的 Unix 紀元時間。
time_detector
服務一律處於兩種狀態之一:certain
或 uncertain
。服務的確定或不確定狀態取決於從各種來源收到的時間建議。
如果 time_detector
服務收到含有 Unix Epoch 時間資訊的建議,且確定該資訊正確無誤,就會覆寫目前的 Unix Epoch 時間 (如果建議的時間與目前的 Unix Epoch 時間不同)。
如果 time_detector
不確定,就不會覆寫目前時間。不確定狀態通常表示 time_detector
服務尚未收到時間建議。如果收到的建議過舊而無法使用,time_detector
服務也會變得不確定。系統會考量建議的年齡,因為使用舊版 Unix Epoch 時間建議進行調整時,會依據裝置上經過的即時時鐘,而這段時間過長時,時鐘可能不準確。
裝置可使用各種來源,自動建立目前的 Unix 紀元時間。在本文件中,這些稱為「來源」。time_detector
服務會根據建議的來源,將建議序列視為不同序列。
time_detector
服務是有狀態的,也就是說,系統會記錄每個來源最近提出的建議。如果來源提供較新的 Unix 紀元時間資訊,系統就會time_detector
提供新建議。time_detector
服務會重新評估新舊建議,並在收到建議時更新裝置狀態。
雖然國際上已同意採用 UTC 時間,但由於各種原因,Android 裝置不一定能直接判斷目前的 Unix 紀元時間:
- Unix Epoch 時間與世界標準時間略有不同。 如要在這兩者之間轉換,您必須瞭解何時會發生閏秒,以及來源如何處理閏秒。
- 來源可能僅在特定時間或特定情況下提供。舉例來說,如果來源需要網路連線,可能只有在裝置連上網際網路時才能使用。
- 來源可能不準確或不精確,也可能含有錯誤。舉例來說,如果電信基地台未正確追蹤 UTC 時間,電信來源可能會提供不準確的時間建議。
- 取得 Unix 紀元時間時,可能會出現不準確的情況。 舉例來說,網路延遲、緩衝或程序排程可能會導致 Unix 紀元時間不準確。
- 用來調整建議的參考時鐘可能不準確,導致建議的經過時間有誤。
AOSP 預設會設定兩個主要的時間偵測來源:
電話和網路來源都需要連線至外部網路,但外部網路不一定隨時可用。
從 Android 12 開始,Android 也支援下列來源,但預設不會設定為使用:
時間設定
使用者可以在 AOSP 設定應用程式中,依序前往「系統」>「日期和時間」,啟用自動偵測時間功能。
圖 1. 在「設定」中自動偵測時間。
下表說明 AOSP 設定應用程式中的時間偵測使用者控制項。
*在 Android 11 以下版本中,這項設定標示為「使用網路提供的時間」 |
|||
AOSP 設定位置 | AOSP 設定名稱 | 範圍 | 行為 |
---|---|---|---|
系統 > 日期和時間 | 自動設定時間* | 所有使用者 | 切換按鈕。 開啟後,裝置會負責偵測目前的 Unix 紀元時間。如果設為「關閉」,使用者可以手動設定裝置時間。 |
使用者手動輸入時間時,輸入的是當地時間,而非 Unix 紀元時間。系統會使用目前的時區推導 Unix 紀元時間,藉此計算目前的 Unix 紀元時間。
設定
裝置製造商可以透過各種方式設定 time_detector
服務,例如要使用的來源,以及如何優先處理這些來源的信號。
來源優先順序
從 Android 12 開始,裝置製造商可以變更core/res/res/values/config.xml
設定檔,指定要納入自動時間偵測的來源,以及 time_detector
考量這些來源的優先順序。
對於搭載 Android 11 以下版本的裝置,來源優先順序會硬式編碼為 ["telephony", "network"]
,也就是說,電話建議的優先順序高於網路建議。
預設的 Android 開放原始碼計畫 (AOSP) 設定如下:
<!-- Specifies priority of automatic time sources. Suggestions from higher entries in the list
take precedence over lower ones.
See com.android.server.timedetector.TimeDetectorStrategy for available sources. -->
<string-array name="config_autoTimeSourcesPriority">
<item>network</item>
<item>telephony</item>
</string-array>
在 Android 12 中,系統會將網路和電話建議設定為預設使用的來源。系統會優先顯示網路時間建議,而非電話時間建議。裝置製造商可以變更來源的順序,還原 Android 11 以下版本的行為,讓電話服務享有較高的優先順序。
根據預設,如果最高優先順序的有效建議與裝置目前的系統時鐘時間相符 (誤差在幾秒內),裝置時間不會變更。這是為了避免為監聽 ACTION_TIME_CHANGED
意圖的已安裝應用程式建立工作。
允許的來源值如下:
允許的時間範圍
Android 14 為 time_detector
服務收到的時間建議設下時間上限。如果裝置支援 32 位元程序,架構會設定時間上限,避免裝置使用可能觸發 2038 年問題的時間建議。
Android 12 導入了較低的時限,用於驗證 time_detector
服務收到的時間建議。系統會根據建構時間戳記,設定用於自動建議的較低時間界限值。這項功能是根據有效時間不得早於裝置系統映像檔建構時間的原則運作。如果時間建議早於時間下限,服務會捨棄該建議,因為如果建構時間戳記正確,該建議就不會有效。time_detector
如果裝置搭載 Android 11 以下版本,time_detector
服務不會驗證傳入的 Unix 紀元時間建議。
時間偵錯和測試
本節說明如何偵錯及測試 time_detector
服務和其他所有來源共用元件的行為。
與 time_detector 服務互動
如要查看 time_detector
服務的設定和 time_detector
服務的狀態,請使用:
adb shell cmd time_detector dump
如要查看其他指令,以便偵錯及測試時區偵測功能,請使用:
adb shell cmd time_detector help
說明輸出內容也會說明可影響 time_detector
行為的服務屬性,以利測試或用於正式環境。device_config
詳情請參閱「使用 device_config 服務設定裝置」。
如要驗證自動時間偵測功能,測試人員必須瞭解 time_detector
服務使用的來源。以下是 adb shell cmd time_detector dump
指令的輸出範例,其中以粗體顯示目前來源和服務狀態的相關資訊:
$ adb shell cmd time_detector dump
TimeDetectorStrategy:
mLastAutoSystemClockTimeSet=null
mEnvironment.isAutoTimeDetectionEnabled()=true
mEnvironment.elapsedRealtimeMillis()=23717241
mEnvironment.systemClockMillis()=1626707861336
mEnvironment.systemClockUpdateThresholdMillis()=2000
mEnvironment.autoTimeLowerBound()=2021-07-19T07:48:05Z(1626680885000)
mEnvironment.autoOriginPriorities()=[network,telephony]
Time change log:
...
Telephony suggestion history:
...
Network suggestion history:
...
Gnss suggestion history:
...
External suggestion history:
...
這項資訊的解讀方式如下:
鍵 | 值 |
---|---|
mEnvironment.isAutoTimeDetectionEnabled() |
是否已啟用自動偵測時間功能。 |
mEnvironment.autoTimeLowerBound() |
目前用於驗證時間建議的下限。 |
mEnvironment.autoOriginPriorities() |
使用的來源和優先順序。 |
時間變更記錄會指出 time_detector
服務何時變更裝置目前的 Unix Epoch 時間。
建議記錄資訊會指出各來源提出的建議。
自動偵測時區
本節將概述 time_zone_detector
服務,這項服務可管理自動偵測時區、設定中的使用者控制選項、電話和位置時區偵測,以及測試詳細資料。
time_zone_detector 服務
在搭載 Android 11 以上版本的裝置上,time_zone_detector
服務會管理自動偵測時區功能。啟用自動偵測時區功能後,系統會視需要調整裝置目前的時區。
啟用自動偵測時區功能後,time_zone_detector
可能處於 certain
或 uncertain
狀態。
當 time_zone_detector
服務處於特定狀態時,表示 time_zone_detector
服務已收到明確的時區資訊,因此可能會覆寫目前的時區。如果系統無法確定時區,表示系統未收到任何資訊或只收到可信度低的資訊,因此不會覆寫目前的時區。
time_zone_detector
的某些狀態可能包括沒有時區資訊可供使用,或有多個時區可供選擇。time_zone_detector
這些州包括:
- 如果裝置位於沒有時區的地點 (例如國際水域或爭議地區),就會進入零時區的特定狀態。這個狀態與不確定狀態類似,但表示
time_zone_detector
不需要採取進一步動作來判斷時區。 - 進入具有多個時區的特定州別,但有不明確或邊界條件。在這種情況下,如果目前的時區是
time_zone_detector
確定的時區之一,系統會保留目前的時區。否則,系統會使用其中一個可用時區。如果使用者先前手動選取時區,或裝置接近邊界,這項功能會讓time_zone_detector
具有黏著性。
time_zone_detector
服務的確定或不確定狀態,取決於演算法傳送的時區建議。
一般而言,建議分為兩種類型,與 time_zone_detector
的可能狀態密切相關:certain
和 uncertain
。建議類型範例如下:
type =
uncertain
,zoneIds = []
- 演算法不知道時區。
type =
certain
,zoneIds = ["Europe/London"]
- 演算法確定時區為 Europe/London。
type =
certain
,zoneIds = []
`- 演算法確定目前位置,但沒有相關聯的區域 ID。
type =
certain
,zoneIds = ["America/Denver", "America/Phoenix"]
- 演算法確定答案是其中一個時區,但無法在美洲/丹佛和美洲/鳳凰城之間做出選擇。
time_zone_detector
服務會根據演算法,將建議序列視為不同的序列。視演算法而定,建議也可能包含中繼資料,指出演算法的確定程度。
time_zone_detector
服務是有狀態的,也就是說,系統會記錄每個演算法提供的最新建議。如果先前的建議不再正確 (也就是演算法現在有不同的建議,或無法再偵測時區),系統就會將新建議傳送至 time_zone_detector
服務。time_zone_detector
服務會重新評估新舊建議,並在收到建議時更新裝置狀態。
Android 支援兩種時區偵測演算法:
- 電話通訊系統
- 位置
time_zone_detector
服務通常會使用單一演算法判斷時區。如果裝置支援位置演算法,裝置使用的演算法會根據使用者設定的時區設定決定。如果演算法無法確定時區,time_zone_detector
通常不會使用其他演算法的建議。與未使用演算法相關聯的建議可能會保留在 time_zone_detector
的記憶體中,但除非演算法變更,否則不會使用這些建議。如果使用者變更自動偵測時區的設定,且演算法也隨之變更,系統會使用新演算法提供的最新建議。
如要進一步瞭解使用多種演算法判斷時區的情況,請參閱「電話回溯模式」。
電話回退模式
在搭載 Android 13 以上版本的裝置上,time_zone_detector
服務支援電話回溯模式。如果位置偵測無法偵測時區,或是偵測時區的時間比電話偵測長,Android 就會暫時使用電話偵測建議。
電話回溯模式適用於支援電話和位置偵測的裝置,且使用者已在「時區設定」中啟用「根據所在位置設定時區」。重新啟動裝置或停用飛航模式時,系統會自動啟用此模式。
在 Android 14 以上版本中,可以透過 LTZP 狀態 API 觸發電話回溯,也就是說,如果 LTZP 報告不確定且環境導致偵測位置或時區的能力下降,就會觸發電話回溯模式。
處於電話回溯模式時,time_zone_detector
服務會使用電話建議,就像位置偵測功能已停用一樣,直到位置演算法提出特定建議為止。收到特定建議後,電話回溯模式就會停用,系統只會使用位置建議。
如要瞭解電話後備模式的設定詳情,請參閱「時區偵測設定」。
時區設定
使用者可以在 AOSP 設定應用程式中啟用及設定自動偵測時區功能。
圖 2. 在「設定」中自動偵測時區。
下表說明 AOSP 設定應用程式中的時區偵測使用者控制選項。
*在 Android 11 以下版本中,這項設定標示為「使用網路提供的時區」 |
|||
AOSP 設定位置 | AOSP 設定名稱 | 範圍 | 行為 |
---|---|---|---|
系統 > 日期和時間 | 自動設定時區* | 所有使用者 | 切換按鈕。 開啟時,裝置會負責偵測目前的時區。如果設為「關閉」,使用者可以手動設定裝置時區。 |
系統 > 日期和時間 | 使用位置資訊設定時區 | 目前使用者 | 切換按鈕。 適用於 Android 12 以上版本。只有在裝置支援位置時區偵測功能時,才會顯示這個切換鈕。 如要瞭解 Android 14 導入的變更,請參閱「 僅支援位置時區偵測的裝置」。 |
位置 | 使用位置資訊 | 目前使用者 | 切換按鈕。 允許或禁止一般使用裝置的位置資訊。如果裝置支援位置時區偵測,這個值就非常重要。 |
下表概述使用者選擇不同設定時,裝置的時區偵測行為:
[日期和時間] 自動設定時區:關閉
- 使用者必須手動選取時區。
[日期和時間] 自動設定時區:開啟
[位置資訊] 使用位置資訊:關閉
- 系統會使用電話信號偵測時區。
[位置資訊] 使用位置資訊:開啟
[日期和時間] 使用位置資訊設定時區:開啟
- 系統會使用位置資訊偵測時區。
[日期和時間] 使用位置資訊設定時區:關閉
- 系統會使用電話信號偵測時區。
多部使用者裝置
由於涉及的幾項設定都以目前使用者為範圍,因此在多使用者 Android 裝置上,當目前使用者變更時,裝置的時區偵測行為可能會隨之變更。
「使用位置資訊設定時區」切換鈕適用於目前使用者,且不受裝置政策限制,因此使用者隨時可以變更其值,即使「自動設定時區」切換鈕已關閉,或裝置政策控制器限制了其他時間或時區控制項,也不例外。
僅支援位置時區偵測演算法的裝置
本節說明僅支援位置資訊演算法的裝置行為。
Android 14 以上版本
- AOSP 設定應用程式不會向使用者顯示「使用位置資訊」選項,裝置的行為則會如同「使用位置資訊」選項已啟用。
- 系統會忽略使用者範圍的
SettingsProvider
設定location_time_zone_detection_enabled
值。這個值會記錄使用者在其他類型裝置上的偏好設定。
Android 12 或 Android 13
- 使用者會在 AOSP 設定應用程式中看到「使用位置資訊」選項,且可以停用該選項。如果停用這項選項,裝置就不會自動偵測時區。
變更為自動偵測或從自動偵測變更時的行為
使用者將時區偵測從「手動」切換為「自動」時,time_zone_detector
可能已確定目前的時區。如果使用者啟用自動偵測功能,裝置的時區可能會同時變更,以符合 time_zone_detector
服務的判斷。
同樣地,如果使用者在「設定」中進行變更,導致 time_zone_detector
服務的現行演算法有所變動,time_zone_detector
可能已收到新演算法的建議,因此裝置的時間可能會立即變更,以符合 time_zone_detector
服務的意見。
電話時區偵測
電話時區偵測功能會使用電話信號判斷目前的時區。詳情請參閱「電話時區偵測」。
位置時區偵測
位置時區偵測功能適用於 Android 12 以上版本。這項選用的自動時區偵測功能可讓裝置根據所在位置判斷目前時區。
Android 12 推出的 location_time_zone_manager
服務會在系統伺服器中執行,並包含負責向 time_zone_detector
服務提交位置演算法建議的程式碼。詳情請參閱「偵測位置時區」。
功能採用注意事項
本節說明位置時區偵測功能,協助裝置製造商判斷是否要在裝置上採用這項功能。
比較電話和位置偵測功能
下表比較使用位置資訊與電話信號偵測時區的優缺點。
類別 | 電話偵測 | 位置偵測 |
---|---|---|
正確性 | 隨國家而異。 取決於 MCC、NITZ 的正確性和可用性。 |
取決於功能設定或外掛程式元件。 正確性通常會因下列因素而異:
|
可更新性 | 電話通訊偵測功能會使用可更新的時區資料模組 (com.android.tzdata APEX) 中的檔案。 |
取決於功能設定或外掛程式元件。 可更新性通常取決於裝置是否使用伺服器或用戶端時區地圖資料。 時區地圖資料不包含在 時區資料模組中,該模組用於更新 Android 的 TZDB 副本和其他時區資訊。 裝置製造商也必須考量時區規則與時區地圖資料的版本一致性。 |
用電量 | 耗電量低或不耗電 | 這取決於使用者的位置資訊設定、使用的外掛程式,以及通常是哪些其他應用程式要求位置資訊。 |
適用地區 | 僅限電話裝置。通常需要可正常運作的 SIM 卡。 | 位置偵測功能取決於可用的位置資訊提供者。 |
使用者隱私
系統通常會根據使用者的地理位置判斷偏好的時區。 位置資訊屬於私密資料。使用者可能會擔心時區偵測功能會分享他們的位置資訊。與時區偵測無關,裝置上執行的所有應用程式都可以讀取裝置目前的時區,不需要 Android 權限,而且應用程式可以從這項資訊推斷出裝置的大概位置。
具體來說,時區偵測可透過被動或主動方式運作:
- 被動:裝置環境中的某個項目會告知裝置要在該環境中使用的時區。
- 啟用:裝置必須自行計算時區,並視使用者的隱私權設定和同意聲明取得裝置位置,然後與外部服務分享位置資訊。如要進一步瞭解使用者隱私權和同意聲明,請參閱下方的討論內容。
被動偵測 (例如使用電話演算法) 不會對使用者造成額外的隱私權影響。
主動偵測 (例如使用位置演算法) 涉及判斷裝置位置,使用者可能不想同意這項操作,而且系統可能會透過網路傳送位置資訊,以判斷時區 ID。
Android 的時區偵測使用者隱私權做法,可讓使用者個別停用預期會啟用的演算法。此外,AOSP 平台程式碼不會直接處理位置資訊本身:位置偵測和將位置資訊對應至時區 ID 的作業,會交由裝置製造商設定的外掛程式元件處理。
如要進一步瞭解使用者隱私權功能,請參閱「偵測位置時區」。
設定
裝置製造商可以設定 time_zone_detector
服務,變更其行為。本節說明 time_zone_detector
服務一般行為的設定選項。如要瞭解電話和時區偵測演算法的設定詳情,請參閱「電話時區偵測」和「位置時區偵測」。
基本 AOSP 設定位於 frameworks/base/core/res/res/values/config.xml
。
設定金鑰 | Android 開放原始碼計畫值 | 說明 |
---|---|---|
config_supportTelephonyTimeZoneFallback |
true |
如果 true ,time_zone_detector 會使用電話回溯模式。這項功能適用於 Android 13 以上版本。
|
變更裝置預設行為
在 AOSP 中,自動偵測時區功能預設為啟用,且 auto_time_zone
設定設為 true
。如要預設停用自動時間偵測功能,請將 frameworks/base/packages/SettingsProvider/res/values/defaults.xml
中定義的 def_auto_time_zone
值設為 false
。
從其他裝置還原備份時,架構預設會更新 auto_time_zone
設定的值。如要確保這項設定不會從備份還原,請在 frameworks/base/packages/SettingsProvider/res/values/blocked_settings.xml
中定義的 restore_blocked_global_settings
陣列中加入 auto_time_zone
。
時區偵錯和測試
本節說明如何偵錯及測試 time_zone_detector
服務和其他所有演算法共用元件的行為。
使用 device_config 服務設定裝置
device_config
服務是 Android 上使用的機制,可透過通常由專有 (非 AOSP) 程式碼從遠端伺服器擷取的值,設定可修改的行為。使用 device_config
值進行測試時,特別是在長時間執行的手動測試期間,裝置可能會同步處理標記,導致標記重設,並清除為測試設定的值。
在 Android 12 以上版本中,如要暫時禁止同步處理標記,請使用:
adb shell cmd device_config set_sync_disabled_for_tests persistent
如要在測試後還原旗標同步處理,請使用:
adb shell cmd device_config set_sync_disabled_for_tests none
還原旗標同步後,請重新啟動裝置。
詳情請參閱 $ adb shell cmd device_config help
。
與 time_zone_detector 服務互動
如要查看 time_zone_detector
設定和 time_zone_detector
服務的狀態,請使用:
adb shell cmd time_zone_detector dump
如要查看其他指令,以便偵錯及測試時區偵測功能,請使用:
adb shell cmd time_zone_detector help
說明輸出內容也會說明可用於影響 time_zone_detector
服務行為的 device_config
服務屬性,以利測試或用於正式環境。詳情請參閱「使用 device_config 服務設定裝置」。
如要驗證時區偵測功能,測試人員必須瞭解 time_zone_detector
使用的演算法。如要瞭解及影響 time_zone_detector
的現行演算法,請使用下列其中一個選項:
- 透過「設定」使用者介面目視檢查。詳情請參閱「時區設定」。
透過 adb 使用指令列:
- 如要傾印
time_zone_detector
狀態,請使用adb shell cmd time_zone_detector dump
- 如要變更裝置設定,請使用其他
time_zone_detector
指令。詳情請參閱adb shell cmd time_zone_detector help
。
- 如要傾印
以下是 adb shell cmd
time_zone_detector dump
指令的輸出範例,其中以粗體顯示目前演算法和服務狀態的相關資訊:
$ adb shell cmd time_zone_detector dump
TimeZoneDetectorStrategy:
mEnvironment.getCurrentUserId()=0
mEnvironment.getConfiguration(currentUserId)=ConfigurationInternal{mUserId=0, mUserConfigAllowed=true, mTelephonyDetectionSupported=true, mGeoDetectionSupported=true, mAutoDetectionEnabled=true, mLocationEnabled=true, mGeoDetectionEnabled=true}
[Capabilities=TimeZoneCapabilitiesAndConfig{mCapabilities=TimeZoneDetectorCapabilities{mUserHandle=UserHandle{0}, mConfigureAutoDetectionEnabledCapability=40, mConfigureGeoDetectionEnabledCapability=40, mSuggestManualTimeZoneCapability=30}, mConfiguration=TimeZoneConfiguration{mBundle=Bundle[{geoDetectionEnabled=true, autoDetectionEnabled=true}]}}]
mEnvironment.isDeviceTimeZoneInitialized()=true
mEnvironment.getDeviceTimeZone()=Europe/London
Time zone change log:
Manual suggestion history:
...
Geolocation suggestion history:
...
Telephony suggestion history:
...
這項資訊的解讀方式如下:
鍵 | 值 |
---|---|
mUserConfigAllowed |
使用者是否無法透過裝置政策控制器控管日期和時間設定。 |
mTelephonyDetectionSupported |
裝置是否具備電話時區偵測功能。 |
mGeoDetectionSupported |
裝置是否支援位置時區偵測。這是根據設定和至少一個 LTZP 的存在狀態判斷的有效狀態。 |
mAutoDetectionEnabled |
是否啟用自動偵測時區功能。 |
mLocationEnabled |
主要位置資訊切換鈕。 |
mGeoDetectionEnabled |
演算法切換:false 代表電話演算法,true 代表位置演算法。 |
建議記錄資訊會指出透過「設定」(手動) 以及電話和位置演算法提出的建議。