关于python:pytz – 将UTC和时区转换为本地时间

pytz - Converting UTC and timezone to local time

我在utc时区有一个datetime,例如:

1
utc_time = datetime.datetime.utcnow()

还有一个pytz时区对象:

1
tz = timezone('America/St_Johns')

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


我想我明白了:

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

该行首先将天真(不知道时区)utc_time datetime对象转换为包含时区(UTC)的datetime对象。然后它使用astimezone功能根据请求的时区调整时间。


我可以建议使用箭头吗?如果我理解这个问题:

1
2
3
4
5
6
7
>>> import arrow
>>> utc = arrow.utcnow()
>>> utc
<Arrow [2014-08-12T13:01:28.071624+00:00]>    
>>> local = utc.to("America/St_Johns")
>>> local
<Arrow [2014-08-12T10:31:28.071624-02:30]>

你也可以使用

1
tz.fromutc(utc_time)


我同意Tzach的回答。只是想包括不需要is_dst参数:

1
pytz.utc.localize(datetime.utcnow()).astimezone(tz)

该代码将当前UTC时间转换为时区感知当前日期时间。

以下代码将当前UTC时间转换为时区感知日期时间,该日期时间不一定是当前的。时区仅附加到UTC时间值。

1
tz.localize(datetime.utcnow())


这是fromutc功能的确切目的:

1
tz.fromutc(utc_time)

(astimezone函数调用fromutc,但首先尝试转换为UTC,在您的情况下不需要)


另一个很简单的方法:

因为utcnow方法返回一个天真的对象,所以你必须将天真的对象转换为知觉对象。使用replace方法,您可以将一个天真的对象转换为知觉对象。然后,您可以使用astimezone方法在不同的时区创建新的日期时间对象。

1
2
3
4
5
6
7
8
from datetime import datetime
import pytz    
utc_time = datetime.utcnow()
tz = pytz.timezone('America/St_Johns')

utc_time =utc_time.replace(tzinfo=pytz.UTC) #replace method      
st_john_time=utc_time.astimezone(tz)        #astimezone method
print(st_john_time)


您也可以使用下面的示例,我将其用于类似的任务

1
2
3
tz = pytz.timezone('America/St_Johns')
time_difference=tz.utcoffset(utc_time).total_seconds() #time difference between UTC and local timezones in 5:30:00 format
utc_time = date + timedelta(0,time_difference)

它运行速度很快,您无需导入其他库。