如何根据 Python 中的时区渲染时间戳

How to render timestamp according to the timezone in Python

我有两个日期时间对象,它们代表不同时区的相同日期时间值。我想将它们转换为 POSIX 时间戳。然而 appearently 调用 datetime.timestamp() returns 一个值而不考虑时区。

from datetime import datetime
import pytz

dt = datetime(2020, 7, 26, 6, 0) 
utc_dt = pytz.utc.localize(dt) # datetime.datetime(2020, 7, 26, 6, 0, tzinfo=<UTC>)
bp = pytz.timezone("Europe/Budapest")
bp_dt = utc_dt.astimezone(bp)  # datetime.datetime(2020, 7, 26, 8, 0, tzinfo=<DstTzInfo 'Europe/Budapest' CEST+2:00:00 DST>)
utc_dt.timestamp() # 1595743200.0
bp_dt.timestamp()  # 1595743200.0

documentation of datetime.timestamp() 表示如下:

For aware datetime instances, the return value is computed as:

(dt - datetime(1970, 1, 1, tzinfo=timezone.utc)).total_seconds()

运行utc_dt - bp_dtreturnsdatetime.timedelta(0)。所以它似乎是用日期时间对象的 UTC 值计算的。

我在网络堆栈中使用 Python。我希望后端处理时区处理,客户端在 API 响应中接收用户时区中预先计算的日期时间值。

获取时区感知时间戳的 Pythonic 方法是什么?

简而言之,我不建议这样做,因为这样会造成一团糟,请参阅我的评论。


技术上,您只需将 datetime 对象的 tzinfo 属性 替换为 UTC 即可。请注意,我在这里使用 dateutil.tz,因此我可以直接设置初始时区(没有 localize())。

from datetime import datetime, timezone
from dateutil import tz

dt = datetime(2020, 7, 26, 6, 0, tzinfo=tz.gettz("Europe/Budapest"))
# dt.utcoffset()
# >>> datetime.timedelta(seconds=7200)

# POSIX timestamp that references to 1970-01-01 UTC:
ts_posix = dt.timestamp()

# timestamp that includes the UTC offset:
ts = dt.replace(tzinfo=timezone.utc).timestamp()

# ts-ts_posix
# >>> 7200.0