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

pytz and astimezone() cannot be applied to a naive datetime

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

1
2
3
4
5
6
7
8
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)

我需要找到这是否属实:

1
print start_date>local_now

但是我得到了这个错误。

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

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

谢谢


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

1
start_date = local_tz.localize(start_date)

对于没有DST转换的时区,将时区附加到天真datetime对象的.replace()方法通常也应该起作用:

1
start_date = start_date.replace(tzinfo=local_tz)

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


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

1
2
3
4
5
6
7
8
9
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()引发异常。


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

1
2
3
4
5
6
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)

你在序列化器中使用它:

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

希望这有助于某人。