将 python datetime 转换为时间戳并在 UTC 中返回仍然使用本地时区

我使用的代码给出了 UTC 时间戳,我想将它们转换为适当的日期时间。不幸的是,当我使用 pytz 测试简单案例时,日期时间增加了6个小时(CST 偏移到 UTC)。我需要保持时区数据的正确性,因为我也在计算其他时区之间的差异。知道为什么以及如何将 UTC 时间戳转换为 UTC 日期时间吗?

In [1]: import pytz


In [2]: from datetime import datetime


In [3]: import time


In [4]: datetime.fromtimestamp(time.mktime(datetime(7,1,1, tzinfo=pytz.UTC).timetuple()), tz=pytz.UTC)
Out[4]: datetime.datetime(2007, 1, 1, 6, 0, tzinfo=<UTC>)


In [5]: datetime.fromtimestamp(time.mktime(datetime(7,1,1).utctimetuple()), tz=pytz.UTC)
Out[5]: datetime.datetime(2007, 1, 1, 6, 0, tzinfo=<UTC>)


In [6]: datetime.fromtimestamp(time.mktime(datetime(7,1,1).utctimetuple()))
Out[6]: datetime.datetime(2007, 1, 1, 0, 0)
113142 次浏览

嗯,我在这里找到了答案: 如何指定时区(UTC)时转换为 Unix 时间? (Python)

In [101]: ts = calendar.timegm(datetime(2010, 7, 1, tzinfo=pytz.utc).timetuple())


In [102]: datetime.fromtimestamp(ts, tz=pytz.utc)
Out[102]: datetime.datetime(2010, 7, 1, 0, 0, tzinfo=<UTC>)

要获取一个朴素的 datetime 对象,该对象以 UTC 表示来自“ second since the epoch”时间戳的时间:

from datetime import datetime


utc_dt = datetime.utcfromtimestamp(ts)

如果希望获取 UTC 时区的可感知日期时间对象:

import pytz


aware_utc_dt = utc_dt.replace(tzinfo=pytz.utc)

把它转换成其他时区:

tz = pytz.timezone('America/Montreal')
dt = aware_utc_dt.astimezone(tz)

直接将时间戳转换为给定时区中的可感知日期时间对象:

dt = datetime.fromtimestamp(ts, tz)