2013-05-13 83 views
1

我想弄清楚在Django中發生的時區轉換髮生了什麼。Django + Postgres時區

我的看法代碼如下,它過濾的日期範圍和羣體上創造的日:

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") 

由Django的產生,當我開始的獲取變量設置爲SQL查詢「 2013年1月5日00:00:00" ,並且請求結束變量設置爲‘2013年11月5日23:59:00’:

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}] 

我在在爲什麼它改變了日期的損失?

任何人有任何想法?

乾杯, 奔

回答

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

+0

任何想法如何我會在我的代碼aboe做到這一點?我已經嘗試在創建datetime對象的子句中添加「replace(tzinfo = utc)」,但仍然有相同的結果,但是有關天真datetimes的警告已從控制檯中消失了..它似乎在輸出中。 – 2013-05-13 05:18:54

+0

你可能應該使用你的真實時區而不是'utc',就像'datetime.datetime.utcnow()。replace(tzinfo = pytz.timezone('Israel'))' – 2013-05-13 05:26:49

+0

done,samething tho,there there way to apply that到輸出? 「a ['created_date']。strftime('%d /%m /%Y')」? – 2013-05-13 05:32:11

1

只是一個通過這個。從Django 1.4開始,Django現在支持時區感知日期和時間。也許有可能您的本地時區和數據存儲在時區(可能是GMT)之間的轉換正在發生。也許這種差異跨越國際日期線,在這種情況下日期可能會有所不同。

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

這就是想到的,無論如何,當你描述你的問題。希望這可以幫助。