Django+Postgres时区

2024-06-08 09:34:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我想弄清楚在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")

当我将get变量start设置为“01/05/2013 00:00:00”,将request end变量设置为“11/05/2013 23:59:00”时,django生成的SQL查询:

^{pr2}$

如果我在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}]

我不知道为什么要改日期?在

有人有什么想法吗?在

干杯, 本


Tags: django数据库getdatetimedaterequeststartend
2条回答

标准Python库中的Python日期时间是一团混乱。在

可能您正在创建朴素的datetime实例(缺少时区信息的实例)。在

# naive
now = datetime.datetime.now()

# TZ aware
from django.utils.timezone import utc
now = datetime.datetime.utcnow().replace(tzinfo=utc)

在最近的Django中,日期时间存储总是可以识别偏移量的,所以最好转换原始的日期时间,否则会发生自动(有时是错误的)转换。在

看看关于Django Time Zones的文档。在

就这么简单。从django1.4开始,Django现在支持时区识别的日期和时间。也许你的本地时区和存储数据的时区(可能是GMT)之间的转换可能在某个时刻发生。也许这种差异跨越了国际日期线,在这种情况下,日期可能会显示不同。在

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

不管怎么说,当你描述你的问题时,你脑海中浮现的就是这个。希望这有帮助。在

相关问题 更多 >