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

Python pytz-将UTC和时区转换为本地时间,python,timezone,utc,pytz,Python,Timezone,Utc,Pytz,我在utc时区有一个datetime,例如: utc_time = datetime.datetime.utcnow() 和pytz时区对象: tz = timezone('America/St_Johns') 将utc时间转换为给定时区的正确方法是什么?我可以推荐使用吗?如果我理解了这个问题: >>> import arrow >>> utc = arrow.utcnow() >>> utc <Arrow [2014-08-12T

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

utc_time = datetime.datetime.utcnow()
和pytz时区对象:

tz = timezone('America/St_Johns')
将utc时间转换为给定时区的正确方法是什么?

我可以推荐使用吗?如果我理解了这个问题:

>>> 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]>
我想我明白了:

pytz.utc.localize(utc_time, is_dst=None).astimezone(tz)
此行首先将原始(不知道时区)utc_time对象转换为包含时区(utc)的
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)
因为
utcnow
方法返回一个naive对象,所以必须将naive对象转换为aware对象。使用
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)
它工作速度快,无需导入其他库。

这正是函数的作用:

tz.fromutc(utc_time)

astimezone
函数调用
来自发动机罩下的UTC
,但尝试先转换为UTC,这在您的情况下是不必要的)

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

pytz.utc.localize(datetime.utcnow()).astimezone(tz)
该代码将当前UTC时间转换为时区感知的当前日期时间

然而,下面的代码将当前UTC时间转换为不一定是当前的时区感知日期时间。时区只是附加到UTC时间值中

tz.localize(datetime.utcnow())

非常感谢。这个库看起来确实是
日期时间
的一个很好的替代品,但是我的项目很大,我不想使用另一个日期时间库造成更多的混乱。我肯定会考虑在其他项目中使用它。我已经删除了我的答案,你应该接受你自己作为一个自我回答:)代码> UTCyTime.Exchange(TynFix= Pytz,UTC)。AsTimeZealZeTZ(TZ)。注意:
pytz.utc
是一种特殊情况(utc偏移量始终为零)。在这种情况下,不需要调用
localize()。如果您确实保留了它(为了一般性);然后在表达式()周围添加
tz.normalize()
调用。@J.F.Sebastian需要调用
localize
,因为
utc\u time
不包含时区信息。没有它,
astimezone
将无法工作。@Tzach您认为
replace()
调用在我前面的评论中做了什么?它也可以用于utc\u timestamp,即带有日期时间的int.utcfromtimestamp(utc\u timestamp),它返回一个时区不知道的日期时间对象。但是utc_time.replace不执行时间分割,只添加一个tzinfo.related:replace方法是个坏主意。它的行为是随机的如果你已经有了一个时区感知的datetime,那么你只需要使用
astimezone
dt.astimezone(tz)
。另请参见,.user8808265的答案要简单得多。这对于使用夏令时的时区是错误的,因为它不考虑夏令时。请参阅。这应该是公认的答案,大约是
本地化
替换
的两倍。是的,这比
替换
更有效,也更不冗长