在我的应用程序中,我使用时USE_TZ=True
区datetime
(django.util.timezone.now
@classmethod
def asUTCDate(cls, date):
if not timezone.is_aware(date):
return timezone.make_aware(date, timezone.utc)
return date.replace(tzinfo=timezone.utc)
我还使用此代码段(如文档中建议的那样)强制检查幼稚/感知日期:
import warnings
warnings.filterwarnings(
'error', r"DateTimeField .* received a naive datetime",
RuntimeWarning, r'django\.db\.models\.fields')
到目前为止,据我所知,这是正确的方法(这是 django 文档中的引述:“解决此问题的方法是在代码中使用 UTC,并且仅在与最终用户交互时使用本地时间。 ”),似乎我的应用程序处理日期非常好......但我刚刚针对使用 Django 1.6 的模型实现了一个过滤器__hour
,它强制基于用户时区进行提取,结果类似于:
django_datetime_extract('hour', "object"."date", Europe/Rome) = 15
但这打破了我的查询,因为我期望的一些结果不包含在集合中,但是当我使用 a__range
在日期之间搜索时,它似乎按预期工作(返回日期在范围内的对象)......所以它似乎我认为 Django 仅在过滤器的查询中考虑时区__hour
......但我不明白为什么......我假设除了在显示日期根据用户 tz 格式化的模板中之外,UTC 无处不在,但也许这不是真的。所以我的问题是:我使用时区的方式对吗?是__hour
过滤器错误还是什么?