pytz - 将UTC时间和时区转换为本地时间

6 浏览
0 Comments

pytz - 将UTC时间和时区转换为本地时间

我有一个以utc时区表示的datetime,例如:

utc_time = datetime.datetime.utcnow()

还有一个pytz时区对象:

tz = timezone('America/St_Johns')

utc_time转换为给定时区的正确方法是什么?

0
0 Comments

问题的原因是对于给定的UTC时间,如何将其转换为本地时间。方法一是使用pytz.utc.localize(datetime.utcnow()).astimezone(tz)来将当前的UTC时间转换为指定时区的本地时间。方法二是使用tz.localize(datetime.utcnow())将当前的UTC时间与指定时区的本地时间进行合并。如果已经有一个时区感知的日期时间对象,则可以直接使用astimezone方法将其转换为指定时区的本地时间。

0
0 Comments

问题的出现原因是utc_time对象不包含时区信息,所以无法直接使用astimezone函数进行时区转换。解决方法是使用pytz库中的localize函数将utc_time对象转换为包含时区信息的datetime对象,然后再使用astimezone函数进行时区调整。

具体的解决方法如下所示:

pytz.utc.localize(utc_time, is_dst=None).astimezone(tz)

这行代码首先将不包含时区信息的utc_time对象转换为包含时区信息的datetime对象(时区为UTC),然后使用astimezone函数根据所需的时区进行时间调整。

需要注意的是,如果时区为UTC,可以直接使用replace函数进行时区转换,不需要使用localize函数。如果仍然使用localize函数,则需要在表达式周围添加tz.normalize()函数调用(如果源时区不是UTC可能需要这样做)。

另外,replace函数不会进行时间偏移,只会添加时区信息。

在几乎五年前的问题中,并没有使用utcfromtimestamp函数。另外,datetime.datetime.utcnow()函数会将tzinfo设置为None。

根据测试结果,localize函数的性能比replace函数慢约7%(replace函数也是文档中的示例)。

可以使用fromutc函数进行时区转换(参见's answer'的回答)。

0
0 Comments

出现的原因:

问题是由于需要将UTC时间和时区转换为本地时间,但是使用astimezone函数进行转换时会先转换为UTC时间,这在这种情况下是不必要的。

解决方法:

使用fromutc函数可以直接将UTC时间转换为本地时间,而不需要先转换为UTC时间。

整理后的文章:

这是fromutc函数的确切目的:

tz.fromutc(utc_time)

astimezone函数在幕后调用fromutc,但在您的情况下尝试先转换为UTC是不必要的)

0