我有一個 python 2.7 代碼庫,我正在嘗試對其進行容器化。正如我所希望的那樣,我們的開發人員無法遷移到 Python 3。
在他們的開發環境中本地運行時,日期時間會遵守時區。我可以確認在運行Python 3.9.6. 但是當我們將它容器化到 Ubuntu 基礎鏡像上時,它就不再正常作業了。
使用python:2.7.18-buster作業正常,但這是一個 3 歲的影像,沒有得到更新。兩者都ubuntu:18.04失敗ubuntu:16.04了。
此時運行時不正確的輸出是
UTC Hour: 22
NY Hour: 22
1609459200.0
London Hour: 22
1609459200.0
重現問題的代碼是
import os
import datetime
import time
from dateutil.parser import parse
date_string="2021-01-01"
os.environ.get("TZ") # should be none, use system TZ, which is UTC
print ("UTC Hour: ", datetime.datetime.now().hour) # should be whatever hour it is in UTC
os.environ["TZ"] = "America/New_York"
print ("NY Hour:", datetime.datetime.now().hour) # should be whatever hour it is in EST
print (time.mktime(parse(date_string).timetuple())) # should be 1609477200.0
os.environ["TZ"] = "Europe/London"
print ("London Hour: ", datetime.datetime.now().hour) # should be whatever hour it is in GMT
print (time.mktime(parse(date_string).timetuple())) # should be 1609459200.0
uj5u.com熱心網友回復:
您可以通過始終如一地使用感知日期時間來避免更改環境變數。要計算 Unix 時間,請從 timedelta 中匯出它。
from datetime import datetime
from dateutil import tz
def to_unix(dt, _epoch=datetime(1970, 1, 1, tzinfo=tz.UTC)):
"""convert aware datetime object to seconds since the unix epoch"""
return (dt-_epoch).total_seconds()
# reference date for demonstration
refdate = datetime(2021, 1, 1)
zone = tz.gettz("America/New_York")
dt_zone = refdate.replace(tzinfo=zone) # 2021-01-01 00:00:00-05:00
print(to_unix(dt_zone)) # 1609477200.0
print("UTC hour:", datetime.now(tz.UTC).hour, "NY hour:", datetime.now(zone).hour)
# -->> -5 hour offset on 11 Nov 2022
zone = tz.gettz("Europe/London")
dt_zone = refdate.replace(tzinfo=zone) # 2021-01-01 00:00:00 00:00
print(to_unix(dt_zone)) # 1609459200.0
print("UTC hour:", datetime.now(tz.UTC).hour, "London hour:", datetime.now(zone).hour)
# -->> 0 hour offset on 11 Nov 2022
注意:在 Linux 上使用 Python 2.7.18 進行測驗,但未在 Docker 環境中進行測驗。
uj5u.com熱心網友回復:
原來python:2.7.18-buster包含了.tzdata下/usr/share/zoneinfo。這也不ubuntu:16.04是ubuntu:18.04,所以發布的功能失敗了。
只需tzdata使用 apt 安裝即可解決問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/534487.html
