将Python datetime转换为UTC时间戳并反向转换仍使用本地时区

80 投票
2 回答
140843 浏览
提问于 2025-04-16 17:23

我正在处理一段代码,它给我提供了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)

2 个回答

171

要从“自纪元以来的秒数”时间戳获取一个简单的日期时间对象,这个对象表示的是UTC时间:

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)
32

嗯,我在这里找到了答案:如何在将时间转换为Unix时间时指定时区(UTC)?(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>)

撰写回答