use*_*299 5 python django datetime date
所以我试图按日期过滤 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])
Run Code Online (Sandbox Code Playgroud)
其中 'q' 是格式分别为 'yyyy'、'yyyymm' 或 'yyyymmdd' 的日期字符串。
这工作得很好,但django 没有考虑时区。Django 基于 UTC 时间而不是 EDT 进行搜索,这是实际日期时间对象的设置。
有没有办法根据特定时区搜索年/月/日?
是的,当启用对时区的支持时,Django 在数据库中以 UTC 格式存储日期和时间信息,在内部使用时区感知日期时间对象,并将它们转换为模板和表单中最终用户的时区。
设置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>)
>>>
Run Code Online (Sandbox Code Playgroud)
现在您可以使用 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)
Run Code Online (Sandbox Code Playgroud)
为了获取给定时区的当前日期,我使用以下 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()
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
12985 次 |
最近记录: |