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

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功能根据请求的时区调整时间.

  • `utc_time.replace(tzinfo = pytz.utc).astimezone(TZ)`.注意:`pytz.utc`是一种特殊情况(总是为零utc偏移).在这种情况下,您不需要`localize()`调用.如果你确实保留它(为了一般性); 然后在表达式周围添加`tz.normalize()`调用([如果源时区不是UTC则可能是必要的](http://pytz.sourceforge.net/#localized-times-and-date-arithmetic)) . (5认同)
  • @Tzach 在我之前的评论中,你认为 `replace()` 调用有什么作用? (2认同)

use*_*265 8

这是fromutc功能的确切目的:

tz.fromutc(utc_time)
Run Code Online (Sandbox Code Playgroud)

astimezone函数fromutc在后台调用,但是会先尝试转换为UTC,这在您的情况下是不需要的)

  • 这应该是公认的答案,大约是“本地化”或“替换”速度的两倍 (3认同)

xbe*_*llo 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]>
Run Code Online (Sandbox Code Playgroud)

你也可以使用

tz.fromutc(utc_time)
Run Code Online (Sandbox Code Playgroud)

  • 谢谢.这个库确实看起来是'datetime`的一个很好的替代品,但是我的项目很大,我不想通过使用另一个日期时间库来创建更多的混淆.我肯定会考虑在其他项目中使用它. (3认同)

pao*_*lov 7

我同意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)

  • 如果你已经有一个时区感知的日期时间,那么你只需要使用 `astimezone`: `dt.astimezone(tz)`。另请参阅 [此答案](/sf/answers/1320407091/) 和 [pytz 文档](https://pypi.python.org/pypi/pytz)。 (2认同)
  • user8808265 的回答要简单得多。 (2认同)

N R*_*awa 5

另一种非常简单的方法:

因为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)