pytz和astimezone()不能应用于天真的日期时间

Tam*_*mpa 50 python timezone datetime pytz

我有一个约会,我需要让时区知道.

local_tz = timezone('Asia/Tokyo')
start_date = '2012-09-27'
start_date = datetime.strptime(start_date, "%Y-%m-%d")   
start_date = start_date.astimezone(local_tz)


now_utc = datetime.now(timezone('UTC'))
local_now = now_utc.astimezone(local_tz)
Run Code Online (Sandbox Code Playgroud)

我需要找到这是否属实:

print start_date>local_now
Run Code Online (Sandbox Code Playgroud)

但是我得到了这个错误.

   start_date = start_date.astimezone(local_tz)
   ValueError: astimezone() cannot be applied to a naive datetime
Run Code Online (Sandbox Code Playgroud)

我将utc转换为tokyo没有任何问题.我需要在东京做好start_date时区感知广告.

谢谢

Mar*_*ers 49

对于pytz时区,使用他们的.localize()方法将一个天真的datetime对象变成一个带有时区的对象:

start_date = local_tz.localize(start_date)
Run Code Online (Sandbox Code Playgroud)

对于没有DST过渡区,则.replace()方法到一个时区附加到幼稚datetime对象通常也应该工作:

start_date = start_date.replace(tzinfo=local_tz)
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅pytz文档的本地化时间和日期算法.

  • [pytz docs](http://pytz.sourceforge.net/)说使用tzinfo属性直接失败了很多时区.应该使用tz.localize()代替. (8认同)

jfs*_*jfs 15

您可以使用local_tz.localize(naive_dt, is_dst=None)将天真的日期时间对象转换为时区感知的对象.

from datetime import datetime
import pytz

local_tz = pytz.timezone('Asia/Tokyo')

start_date = local_tz.localize(datetime(2012, 9, 27), is_dst=None)
now_utc = datetime.utcnow().replace(tzinfo=pytz.utc)

print start_date > now_utc
Run Code Online (Sandbox Code Playgroud)

is_dst=None 如果给定的本地时间不明确,则强制.localize()引发异常.