我有一个utc时区的datetime
,例如:
utc_time = datetime.datetime.utcnow()
和一个pytz时区对象:
tz = timezone('America/St_Johns')
将utc_time
转换为给定时区的正确方法是什么?
我想我明白了:
pytz.utc.localize(utc_time, is_dst=None).astimezone(tz)
这一行首先将天真型(不知道时区)utc_time
datetime
对象转换为包含时区(UTC)的datetime
对象。然后使用astimezone
函数根据请求的时区调整时间。
这就是fromutc
函数的确切用途:
tz.fromutc(utc_time)
(astimezone
函数在底层调用fromutc
,但首先尝试转换为UTC,这在您的情况下是不需要的)
我同意扎克的回答。只是想包含不需要的is_dst参数:
pytz.utc.localize(datetime.utcnow()).astimezone(tz)
该代码将当前UTC时间转换为可识别时区的当前日期时间。
而下面的代码将当前UTC时间转换为时区感知的datetime,这不一定是当前的。时区只是附加到UTC时间值中。
tz.localize(datetime.utcnow())
我可以推荐使用箭头吗?如果我理解了问题:
>>> 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]>
也可以使用
tz.fromutc(utc_time)
另一个很简单的方法:
因为utcnow
方法返回一个朴素型对象,所以必须将朴素型对象转换为感知型对象。使用replace
方法可以将朴素对象转换为感知对象。然后,您可以使用astimezone
方法在不同的时区创建新的datetime对象。
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)
您也可以使用下面的示例,我将其用于类似的任务
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)