正确使用 utc 时间戳和本地日期时间

Correct usage of utc timestamps and local datetime

我已经使用 time.time() 跨客户端应用程序生成时间戳。这些时间戳被累积并分批发送到外部独立位置。

在客户端应用程序上呈现这些时间戳时,我打算使用 datetime.fromtimestamp(ts_from_external_source) 来创建本地 datetime 对象,而不定义时区,因此它默认采用本地。

这是推荐的方法吗?

是的,这是一个很好的方法:您存储 "Unix epoch" 样式时间,并在显示它们之前将它们转换为您需要的任何本地时间。

如果您仅将其用于显示时间戳,则可以使用代表本地时间的原始日期时间对象。

datetime.fromtimestamp(ts_from_external_source) 应该在 DST 转换期间工作(本地时间可能不明确,但如果我们忽略闰秒,POSIX 时间戳就不会)。尽管如果本地时区 had/will 在 时具有不同的 UTC 偏移量,但对于 past/future 的日期可能会失败,但底层 C 库不使用历史时区the tz database 等数据库(Linux、OS X 使用它。python on Windows -- 可能不会)。

datetime.fromtimestamp(ts_from_external_source) 对于大多数时区的最近日期应该没问题。

您可以使用日期为 2010-2015 的 Europe/Moscow 时区进行测试(时区规则在那个时期发生了变化)。

您可以使用 pytz 模块提供 tz 数据库:

from datetime import datetime, timedelta
from tzlocal import get_localzone # $ pip install tzlocal
import pytz # $ pip install pytz

tz = get_localzone() # get the local timezone as pytz timezone (with historical data)
utc_dt = datetime(1970, 1, 1, tzinfo=pytz.utc) + timedelta(seconds=ts_from_external_source)
dt = utc_dt.astimezone(tz)

或:

dt = datetime.fromtimestamp(ts_from_external_source, tz)

运行 these tests 查看 datetime + timedeltafromtimestamp() 是否在您的平台上产生不同的结果。