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

时间:2015-01-08 00:46:05

标签: python python-2.7 datetime time

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

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

这是推荐的做法吗?

2 个答案:

答案 0 :(得分:1)

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

datetime.fromtimestamp(ts_from_external_source)应该在DST转换期间工作(本地时间可能不明确但如果我们忽略闰秒则不会出现POSIX时间戳)。虽然如果本地时区在时具有/将具有不同的UTC偏移,但是对于过去/未来的日期可能会失败,但基础C库不使用历史时区数据库,例如{{3} (Linux,OS X在Windows上使用它.python - 可能不会。)

对于大多数时区的近期日期,

datetime.fromtimestamp(ts_from_external_source)应该没问题。

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

您可以使用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)

运行the tz database以查看datetime + timedeltafromtimestamp()是否会在您的平台上产生不同的结果。

答案 1 :(得分:0)

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