如何创建自 unix 纪元以来给定秒数的日期时间对象?

How to create a datetime object given seconds since unix epoch?

网上似乎有很多关于做一个非常基本的事情的混淆:创建一个带有 UTC 时区的日期时间对象,给定自 UTC 时区的 unix 纪元以来的秒数。基本上,我总是想在绝对 time/UTC.

中工作

我正在使用 python 3.5(目前最新的)并且想简单地从浮点值获取 UTC(+0/Zulu 偏移量)上下文中的 datetime 对象自 1970 年 1 月 1 日以来经过的秒数。

这是错误的,因为第一次是在我当地的时区创建的,然后我尝试切换到 UTC。

import datetime
import pytz
dt = datetime.datetime.fromtimestamp(my_seconds).replace(tzinfo=pytz.UTC)

Python 为这种情况提供了方法 utcfromtimestamputcfromtimestamp

import datetime

seconds = 0
utcdate_from_timestamp = datetime.datetime.utcfromtimestamp(seconds)

如果 my_seconds 是 POSIX 时间戳,则在 Python 中将其转换为 datetime 3:

#!/usr/bin/env python3
from datetime import datetime, timedelta, timezone

utc_dt = datetime(1970, 1, 1, tzinfo=timezone.utc) + timedelta(seconds=my_seconds)
utc_dt = datetime.fromtimestamp(my_seconds, timezone.utc)
naive_utc_dt = datetime.utcfromtimestamp(my_seconds)

如果您当地的时区是 "right"(非 POSIX),那么只有第一个公式是正确的(其他人将 my_seconds 解释为 TAI 时间戳 datetime(1970, 1, 1, 0, 0, 10) TAI在这种情况下是纪元)。

The first formula is more portable and may support a wider input range than the others.

由于rounding errors on some Python versions,第一个和第二个表达式的结果可能不同。

第二次和第三次调用应该仅在 tzinfo 属性上有所不同(后者 returns 一个简单的日期时间对象 (.tzinfo is None))。您应该更喜欢时区感知的日期时间对象,以避免歧义。