首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Django + Postgres时区

Django + Postgres时区
EN

Stack Overflow用户
提问于 2013-05-13 12:25:49
回答 2查看 3.8K关注 0票数 1

我正在试图弄清楚Django发生的时区转换是怎么回事。

我的视图代码如下,它根据日期范围进行过滤,并在创建当天进行分组:

代码语言:javascript
运行
复制
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“,并将request end变量设置为"11/05/2013 23:59:00”时,django生成的SQL查询:

代码语言:javascript
运行
复制
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数据库上手动运行它,一切都很好,找到了以下内容:

代码语言:javascript
运行
复制
created_date  total
2013-05-10    22
2013-05-11    1

但是,如果我执行以下操作:

代码语言:javascript
运行
复制
for a in fads:
        recent_ads.append({"dates": a['created_date'].strftime('%d/%m/%Y'), 'ads': a['total']})

它给出了以下输出:

代码语言:javascript
运行
复制
[{"dates": "09/05/2013", "ads": 1}, {"dates": "10/05/2013", "ads": 22}]

我不明白为什么它改变了日期?

有人有什么想法吗?

干杯,本

EN

回答 2

Stack Overflow用户

发布于 2013-05-13 12:41:44

标准Python库中的python datetime非常混乱。

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

代码语言:javascript
运行
复制
# 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
EN

Stack Overflow用户

发布于 2013-05-13 12:44:10

就这一点吧。从Django 1.4开始,Django现在支持时区感知的日期和时间。也许您的本地时区和数据存储所在的时区(可能是GMT)之间的转换在某个时刻发生。也许这种差异跨越了国际日期变更线,在这种情况下,日期可能会以不同的方式显示。

Django有一个有趣的部分描述了新的时区支持功能。

https://docs.djangoproject.com/en/1.4/topics/i18n/timezones/

无论如何,当你描述你的问题时,这就是你脑海中浮现的。希望这能有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16514847

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档