将Python的日期时间转换为UTC时间戳并还原仍然使用本地时区

78

我正在处理一个给出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个回答

165

要从“自纪元以来的秒数”时间戳中获取表示UTC时间的naive datetime对象:

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)

变量 ts 是什么? - IssamLaradji
1
@Curious 这个方法的名称中有“from timestamp”这些词。这表明参数是一个时间戳。代码前的文本描述也暗示了这一点。我认为将其写成“utc_dt = datetime.utcfromtimestamp(timestamp)”会过于冗长,因此我将“timestamp”缩写为“ts”。 - jfs

32

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接