1

我试图弄清楚 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}]

我不知道为什么它改变了日期?

有人有什么想法吗?

干杯,本

4

2 回答 2

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的文档。

于 2013-05-13T04:41:43.880 回答
1

只是通过这个。从 Django 1.4 开始,Django 现在支持时区感知日期和时间。也许您的本地时区和存储数据的时区(可能是格林威治标准时间)之间的转换可能在某个时候发生。也许这种差异跨越了国际日期变更线,在这种情况下,日期可能会有所不同。

Django 有一个有趣的部分描述了新的时区支持功能。
https://docs.djangoproject.com/en/1.4/topics/i18n/timezones/

无论如何,当你描述你的问题时,这就是我想到的。希望这可以帮助。

于 2013-05-13T04:44:09.667 回答