2015-10-16 112 views
3

Django初學者在這裏。django時區支持混淆

在官方的文檔:

# Support for time zones is enabled in the default settings file, so 
# Django expects a datetime with tzinfo for pub_date. Use timezone.now() 
# instead of datetime.datetime.now() and it will do the right thing. 
>>> from django.utils import timezone 
>>> q = Question(question_text="What's new?", pub_date=timezone.now()) 

試圖做重現它在./manage.py殼:

In [35]: from django.conf import settings 

In [36]: settings.USE_TZ 
Out[36]: True 

In [37]: settings.TIME_ZONE 
Out[37]: 'Europe/Moscow' 

In [38]: from django.utils import timezone 

    # UTC 
In [39]: timezone.now() 
Out[39]: datetime.datetime(2015, 10, 16, 9, 47, 50, 755418, tzinfo=<UTC>) 

    # Actual time 
In [40]: timezone.datetime.now() 
Out[40]: datetime.datetime(2015, 10, 16, 12, 47, 54, 554197) 

    # UTC 
In [41]: timezone.activate("Europe/Moscow"); timezone.now() 
Out[41]: datetime.datetime(2015, 10, 16, 9, 47, 59, 405269, tzinfo=<UTC>) 

    # Actual time 
In [42]: timezone.activate("Europe/Moscow"); timezone.datetime.now() 
Out[42]: datetime.datetime(2015, 10, 16, 12, 48, 3, 179085) 

當我跑步時timezone.now()在文件規定,我越來越UTC這是不對的。當我運行timezone.datetime.now()(我認爲只是撥打datetime.datetime.now(),這是使用全系統時區)我正在得到正確的東西。

嘗試不同的時區,仍然得到純UTC。

我在做什麼錯?

回答

1

timezone.now()表現得應該如此:if USE_TZ=True;它將當前時間作爲知曉的日期時間對象(UTC)返回。

2015-10-16 09:47:50+00:00 (UTC)是與2015-10-16 12:47:50+03:00 (MSK)相同的時刻。 UTC時間使用當前時區在模板中呈現(默認爲TIME_ZONE設置,因此無需在此處使用timezone.activate()明確設置)。

您可以使用timezone.localtime(timezone.now())(不需要)明確獲取該值。

+0

這很奇怪,我認爲settings.USE_TZ的設置目的是自動轉換爲TIME_ZONE。 因此,如果我理解正確,USE_TZ = True以某種方式提供了將時區信息「注入」到timezone.now()對象的方法。我對嗎? – mkurnikov

+2

@mkurnikov:它並不奇怪:[最佳實踐](http://stackoverflow.com/a/2532962/4279):在世界各地使用UTC,轉換爲本地時間顯示:這正是django所做的。要理解爲什麼你應該儘可能地使用UTC,請考慮例如,如何查找日期時間過去24小時(http://stackoverflow.com/a/26313848/4279) – jfs

+0

好吧,現在我理解。謝謝你的答案。 – mkurnikov