Python pytz-将UTC和时区转换为本地时间
我在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
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的答案要简单得多。这对于使用夏令时的时区是错误的,因为它不考虑夏令时。请参阅。这应该是公认的答案,大约是本地化
或替换
的两倍。是的,这比替换
更有效,也更不冗长