56

我有一个日期,我需要让它知道时区。

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转换为东京。我需要在东京制作 start_date 时区感知广告。

谢谢

4

3 回答 3

58

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

start_date = local_tz.localize(start_date)

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

start_date = start_date.replace(tzinfo=local_tz)

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

于 2012-09-27T16:37:38.633 回答
16

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

于 2012-10-03T16:51:54.757 回答
1

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

希望这可以帮助某人。

于 2018-06-19T10:11:15.597 回答