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

标签 python python-2.7 datetime time

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

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

这是推荐的做法吗?

最佳答案

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

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

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() 是否在您的平台上产生不同的结果。

关于python - 正确使用 utc 时间戳和本地日期时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27831245/

相关文章:

python - 为什么 virtualenv 不虚拟化任意目录?

python - re.search 多行 Python

python - Django 日期时间字段 - 在 View 中转换为时区

python - SQLAlchemy DateTime 对象只能是幼稚的吗?

c# - Linq 日期区分为字符串 yyyy-mm-dd

python - Django 表单永远无效,因此不会保存到数据库

Python AXL/SOAP w。啧啧。如何避免重复的字典键?

python - X 和 Y 或 Z - 三元运算符

python - `try ... except not` 施工

python - 如何让我的 while 循环在 Python 中工作?