我正在试图弄清楚Django正在进行的时区转换是怎么回事。
我的观看代码如下所示,它会在创建当天过滤日期范围和群组:
def stats_ad(request):
start_date = datetime.datetime.strptime(request.GET.get('start'), '%d/%m/%Y %H:%M:%S')
end_date = datetime.datetime.strptime(request.GET.get('end'), '%d/%m/%Y %H:%M:%S')
fads = Ad.objects.filter(created__range=[start_date, end_date]).extra(select={'created_date': 'created::date'}).values('created_date').annotate(total=Count('id')).order_by("created_date")
当我将start的get变量设置为“01/05/2013 00:00:00”并将请求结束变量设置为“11/05/2013 23:59:00”时,django生成的SQL查询:
SELECT (created::date) AS "created_date", COUNT("ads_ad"."id") AS "total" FROM "ads_ad" WHERE "ads_ad"."created" BETWEEN E'2013-05-01 00:00:00+10:00' and E'2013-05-11 23:59:59+10:00' GROUP BY created::date, (created::date) ORDER BY "created_date" ASC
如果我在Postgresql数据库上手动运行它,那就好了,找到以下内容:
created_date total
2013-05-10 22
2013-05-11 1
但是,如果我执行以下操作:
for a in fads:
recent_ads.append({"dates": a['created_date'].strftime('%d/%m/%Y'), 'ads': a['total']})
它给了我以下输出:
[{"dates": "09/05/2013", "ads": 1}, {"dates": "10/05/2013", "ads": 22}]
我为什么改变日期而感到茫然?
有人有任何想法吗?
干杯, 本
答案 0 :(得分:1)
来自标准python库的Python日期时间很乱。
您可能正在创建天真的日期时间实例(缺少时区信息的实例)。
# naive
now = datetime.datetime.now()
# TZ aware
from django.utils.timezone import utc
now = datetime.datetime.utcnow().replace(tzinfo=utc)
在最近的Django中,日期时间存储始终是偏移感知的,因此您可以更好地转换天真的日期时间 - 否则将发生自动(有时是错误的)转换。
查看有关Django Time Zones的文档。
答案 1 :(得分:1)
刚才这个。从Django 1.4开始,Django现在支持时区感知日期和时间。也许你的本地时区与存储数据的时区(可能是GMT)之间的转换可能在某个时刻发生。也许这种差异超过了国际日期,在这种情况下日期可能会有所不同。
Django有一个有趣的部分描述了新的时区支持功能 https://docs.djangoproject.com/en/1.4/topics/i18n/timezones/
无论如何,当你描述你的问题时,我想到了什么。希望这会有所帮助。