pytz和astimezone()不能应用于无意义的datetim

2024-05-01 23:04:13 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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转换成东京没有问题。我需要在东京做好开始日期时区的广告。

谢谢


Tags: datetimedatelocalstartnowtz约会utc
3条回答

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

start_date = local_tz.localize(start_date)

对于没有DST转换的时区,将时区附加到原始对象的datetime对象也应该正常工作:

start_date = start_date.replace(tzinfo=local_tz)

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

您可以使用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()引发异常。

如果使用的是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)

希望这能帮助别人。

相关问题 更多 >