Tza*_*ach 30 python timezone utc pytz
我有一个datetimeutc时区,例如:
utc_time = datetime.datetime.utcnow()
Run Code Online (Sandbox Code Playgroud)
还有一个pytz时区对象:
tz = timezone('America/St_Johns')
Run Code Online (Sandbox Code Playgroud)
转换utc_time到给定时区的正确方法是什么?
Tza*_*ach 47
我想我明白了:
pytz.utc.localize(utc_time, is_dst=None).astimezone(tz)
Run Code Online (Sandbox Code Playgroud)
该行首先将天真(不知道时区)utc_time datetime对象转换为datetime包含时区(UTC)的对象.然后它使用该astimezone功能根据请求的时区调整时间.
这是fromutc功能的确切目的:
tz.fromutc(utc_time)
Run Code Online (Sandbox Code Playgroud)
(astimezone函数fromutc在后台调用,但是会先尝试转换为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]>
Run Code Online (Sandbox Code Playgroud)
你也可以使用
tz.fromutc(utc_time)
Run Code Online (Sandbox Code Playgroud)
我同意Tzach的回答。只想包含is_dst参数不是必需的:
pytz.utc.localize(datetime.utcnow()).astimezone(tz)
Run Code Online (Sandbox Code Playgroud)
该代码将当前UTC时间转换为时区感知的当前日期时间。
而下面的代码将当前的UTC时间转换为不一定是当前时区的日期时间。时区只是附加到UTC时间值中。
tz.localize(datetime.utcnow())
Run Code Online (Sandbox Code Playgroud)
另一种非常简单的方法:
因为utcnow方法返回一个朴素对象,所以你必须将朴素对象转换为感知对象。使用replace方法,您可以将朴素对象转换为感知对象。然后您可以使用该astimezone方法在不同的时区创建新的日期时间对象。
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)
Run Code Online (Sandbox Code Playgroud)