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

时间:2012-09-27 16:34:03

标签: python datetime timezone 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)

我需要找出是否属实:

print start_date>local_now

但是我收到了这个错误。

   start_date = start_date.astimezone(local_tz)
   ValueError: astimezone() cannot be applied to a naive datetime

我将utc转换为tokyo没有任何问题。我需要在tokyo中使用start_date时区识别广告。

由于

3 个答案:

答案 0 :(得分:45)

对于pytz时区,请使用他们的.localize()方法将原始datetime对象转换为具有时区的对象:

start_date = local_tz.localize(start_date)

对于没有DST转换的时区,将时区附加到天真datetime对象的.replace() method通常也可以正常工作:

start_date = start_date.replace(tzinfo=local_tz)

有关详细信息,请参阅pytz文档的localized times and date arithmetic

答案 1 :(得分: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
如果给定的本地时间不明确,

is_dst=None会强制.localize()引发异常。

答案 2 :(得分:0)

如果您使用的是Django Rest Framework,则可以覆盖DateTimeField类,如:

class DateTimeFieldOverridden(serializers.DateTimeField):

def to_representation(self, value):
    local_tz = pytz.timezone(TIME_ZONE)
    value = local_tz.localize(value)
    return super(DateTimeFieldOverridden, self).to_representation(value)

你在序列化器中使用它是这样的:

date_time = DateTimeFieldOverridden(format='%d-%b-%Y', read_only=True)

希望这有助于某人。