HOWTO · Python
在 Python 中轉換 Epoch 到 Datetime
它介紹瞭如何在 Python 中轉換紀元到日期時間。
本頁內容
Unix epoch 時間是從 1970-01-01 00:00:00 UTC 起算的秒數。像 1606262400 這樣的時間戳代表一個確切時刻;要將它轉換成易讀的日期,必須選擇時區。需要日期與時間物件時,請使用 datetime;若任務適合使用 struct_time 值,則可使用 time。
使用 datetime.fromtimestamp() 轉換 Epoch 秒數
Python 的 datetime 模組提供 datetime.fromtimestamp(),可接收時間戳並回傳 datetime 物件。預設情況下,它會依照電腦的本地時區解讀時間戳,並回傳不含時區資訊的 naive datetime。傳入 timezone.utc,即可取得代表 UTC 的 aware datetime。
執行以下範例:
本節中的程式碼以及顯示的標籤或輸出仍為英文。
from datetime import datetime, timezone
timestamp = 1606262400
utc_datetime = datetime.fromtimestamp(timestamp, timezone.utc)
print(utc_datetime)
若會多次使用這個類別,可以採用較精簡的匯入方式:寫成 from datetime import datetime,然後呼叫 datetime.fromtimestamp(...)。fromtimestamp() 參考文件說明其引數與平台行為。跨系統交換時刻時,請以 UTC 保存時間戳,再於應用程式的顯示邊界轉換成所需時區。
使用 time 模組轉換 Epoch 秒數
Python 的 time 模組提供兩種實用的轉換方式。time.localtime()會回傳依主機本地時區解讀的九欄位 struct_time。time.gmtime()則會回傳以 UTC 為基準的對應 struct_time。這些是結構化時間值,不是 datetime 物件。
本節中的程式碼以及顯示的標籤或輸出仍為英文。
import time
timestamp = 1554723620
local_value = time.localtime(timestamp)
utc_value = time.gmtime(timestamp)
print("Local:", local_value)
print("UTC:", utc_value)
本地時間那一行會依系統時區設定而變化,因此其中的時鐘欄位可能與 UTC 那一行不同。範例輸出中的 Local: 和 UTC: 標籤維持英文。需要穩定的 UTC 欄位時,請使用 time.gmtime();只有在確實需要主機本地時間表示法時,才使用 time.localtime()。
格式化轉換後的日期與時間
time 值和 datetime 物件都提供 strftime(),可用來格式化日期與時間。%Y、%m、%d、%H、%M 和 %S 等指示符分別代表年、月、日、時、分和秒。%d 會以補零方式顯示月份中的日期,且具有良好的跨平台支援。%-d 在部分平台上會省略前導零,但並非所有平台都支援。
本節中的程式碼以及顯示的標籤或輸出仍為英文。
import time
timestamp = 1554723620
utc_value = time.gmtime(timestamp)
print(time.strftime("%Y-%m-%d %H:%M:%S", utc_value))
datetime.strftime()也能搭配相同的數字指示符。%A 和 %B 等會輸出名稱的指示符,以及依語系設定的 %c,可能因系統語系而異;請勿依賴它們的文字結果來產生機器可讀資料。格式指示符可參考 strftime.org。
處理 UTC、時區與毫秒時間戳
時間戳表示相對於 UTC epoch 的秒數,但本地時間轉換會使用電腦設定的時區。若要儲存或計算代表實際時刻的值,建議使用帶有時區資訊的 UTC 值。要在其他時區顯示時,可對這個 aware 值呼叫 astimezone()。預設的 datetime.fromtimestamp()會回傳不含時區資訊的 naive 值;除非你確定原本就要將它解讀為 UTC,否則不要把它當成 UTC。
有些 API 回傳的是毫秒,而不是秒。毫秒時間戳通常遠大於目前常見的秒時間戳;將它傳給任一轉換 API 前,請先除以 1000。若需要保留亞秒精度,請保留小數部分。
本節中的程式碼以及顯示的標籤或輸出仍為英文。
from datetime import datetime, timezone
timestamp_ms = 1606262400123
timestamp_seconds = timestamp_ms / 1000
utc_datetime = datetime.fromtimestamp(timestamp_seconds, timezone.utc)
print(utc_datetime)
最終值會包含輸入所表示的小數秒。若要以本地時間顯示,請呼叫 utc_datetime.astimezone();結果中的時鐘時間會依主機設定的時區而變。若要不受顯示格式影響地保留該時刻,請保存原始數值時間戳。