【发布时间】:2020-07-26 10:04:20
【问题描述】:
我有两个日期时间对象,它们代表不同时区的相同日期时间值。我想将它们转换为 POSIX 时间戳。然而,无论时区如何,看似调用 datetime.timestamp() 都会返回一个值。
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() 表示如下:
对于感知日期时间实例,返回值计算为:
(dt - datetime(1970, 1, 1, tzinfo=timezone.utc)).total_seconds()
运行utc_dt - bp_dt 返回datetime.timedelta(0)。所以它似乎是用 datetime 对象的 UTC 值计算的。
我在网络堆栈中使用 Python。我希望后端处理时区处理,并让客户端在 API 响应中接收用户时区中预先计算的日期时间值。
获取时区感知时间戳的 Pythonic 方法是什么?
【问题讨论】:
-
POSIX timestamps 应始终引用 UTC 以明确无误 - 否则,您必须将时区信息绑定到数字 - 本质上,您有
datetime用于此目的的对象。所以简而言之,我会说你没有。 -
@MrFuppes 我理解,但我不明白为什么我仍然无法获得 naive 时间戳对象。我希望后端处理时区,客户端应该只接收预先计算的日期时间值。
-
这很好,但是客户端将如何处理时间戳?如果你例如转换回 Python (
datetime.fromtimestamp()) 中的日期时间对象,它将假定时间戳是指 UTC,并在客户端的时区设置(客户端的本地时间)中为您提供一个类似于 UTC 的天真日期时间对象。 -
@MrFuppes 客户端读取时间戳并根据用户的语言显示。我想将客户端收到的 UTC 6:00 存储为 8:00 并将其显示为上午 8 点。
-
好吧,我仍然希望传递 POSIX 时间戳,引用 UTC 并在客户端进行本地化 ;-) Unix 时间非常普遍,因此在最常见的情况下应该有一种方便的方法来执行此操作语言。