如何使用时区感知日期过滤模型?

时间:2013-10-03 15:07:51

标签: python django date datetime

所以我试图按日期过滤django模型。仅使用年份,年份+月份或年份+月份+ day_of_month。我现在使用的策略是:

n.filter(create_date__year=q)
n.filter(create_date__year=q[:4],create_date__month=q[4:6])
n.filter(create_date__year=q[:4],create_date__month=q[4:6],create_date__day=q[6:8])

其中'q'是日期字符串,格式分别为'yyyy','yyyymm'或'yyyymmdd'。

这很好用 django没有考虑时区。 Django根据UTC时间而不是EDT进行搜索,这是实际日期时间对象的设置。

有没有办法根据特定时区搜索月/月/日?

2 个答案:

答案 0 :(得分:3)

是的,当启用对时区的支持时,Django将日期和时间信息以UTC格式存储在数据库中,在内部使用时区感知日期时间对象,并将它们转换为模板和表单中最终用户的时区。 / p>

在设置文件中设置USE_TZ = True

创建时区感知日期时间,首先将其转换为utc并在过滤器中使用该日期时间。

>>> import datetime
>>> import pytz
>>> 
>>> unaware = datetime.datetime.strptime("20131103", "%Y%m%d")
>>> amsterdam = pytz.timezone('Europe/Amsterdam')
>>> aware = unaware.replace(tzinfo=amsterdam)
>>> d = aware.astimezone(pytz.UTC)
>>> 
>>> unaware
datetime.datetime(2013, 11, 3, 0, 0)
>>> amsterdam
<DstTzInfo 'Europe/Amsterdam' AMT+0:20:00 STD>
>>> aware
datetime.datetime(2013, 11, 3, 0, 0, tzinfo=<DstTzInfo 'Europe/Amsterdam' AMT+0:20:00 STD>)
>>> d
datetime.datetime(2013, 11, 2, 23, 40, tzinfo=<UTC>)
>>> 

现在您可以使用d。

过滤对象
objs = SomeModel.objects.all() 

objs.filter(date__year=d.year)
objs.filter(date__year=d.year, date_month=d.month)
objs.filter(date=d.date)

答案 1 :(得分:1)

要获取给定时区的当前日期,我使用以下utils函数,该函数在使用pytz.timezone("America/New_York")参数调用的情况下可能很有用。

from django.utils.timezone import now

def timezone_today(tz=utc):
    """
    Return the current date in the given timezone :param:`tz`.
    """
    return now().astimezone(tz).date()