2015-09-26 22 views
2

所以,在我的設置,我有以下:Django時區是如何工作的?

LANGUAGE_CODE = 'en-us' 

USE_I18N = True 

USE_L10N = True 

USE_TZ = True 

TIME_ZONE = 'Europe/Copenhagen' 

然而,當我發出:

timezone.now() 
datetime.datetime(2015, 9, 26, 8, 47, 15, 862729, tzinfo=<UTC>) 

,時間晚了兩個小時。

我正在閱讀文檔,我可以看到這個方法調用datetime.datetime()並且信息是正確的。我可以看到輸出基於變量TIME_ZONE,它被設置爲我當前的位置。不應該timezone.now()獲得正確的TIME_ZONE時間嗎?

另一個問題:是否datetime.datetime()從服務器獲取信息?

回答

1
  1. 是的,它從運行代碼的機器獲取信息。
  2. 不,它不會給你當地的時間。不,它不會在您的設置中使用時區(doc refcode ref)。它使用UTC時間(Europe/Copenhagen是UTC + 2)。
  3. 如果你想獲得當地DateTime對象,你應該讓天真:

    timezone.make_naive(timezone.now(), timezone.get_current_timezone()) 
    
+0

我已將timezone.now添加到我的models.py中,以便在某些類中標記修改時間。沒有更好的方法嗎? –

+1

爲什麼你會建議使用天真的日期時間對象?如果'USE_TZ = True',那麼'timezone.now()。astimezone(timezone.get_current_timezone())'返回當前時區中的可識別日期時間對象。儘管你不需要手動調用'.astimezone()',有'timezone.localtime()'它爲你和相應的模板過濾器('localtime'),你也不需要調用,如果'USE_TZ = True' – jfs

+0

@ J.F。塞巴斯蒂安,偉大的一點!謝謝:) –

2

約時區感知日期時間,重要的是他們不發生該時區存儲在,但事實他們代表一個時間點。當這是真的時,它是微不足道的(嗯,可能,無論如何)顯示日期時間在任何你想要的時區。

因此,Django的工作方式是所有意識到的日期時間都以UTC存儲。 (即使如此,根據數據庫設置,它們可能不會從數據庫返回,但取決於數據庫設置。)然後它爲您提供工具(例如TIME_ZONE設置和activate())來設置呈現用戶顯示模板時應使用的時區。

所以你所描述的一切都是設計。它實際上是否會導致您遇到問題?

+0

如果我在settings.py中設置我的時區,後者我調用timezone.now(),它不應該返回正確的時間嗎?正如我所提到的那樣,它會返回一個時間對象。 –

+0

@ E.Camilo:UTC上午8點和歐洲/哥本哈根(與DST)*上午10點*是同一時刻*。所以這是正確的時間。 'TIME_ZONE'設置告訴Django用戶顯示的默認時區,它不會影響Python對象中使用的時區。如果你真的想轉換它,你可以(見#2 [這裏](https://docs.djangoproject.com/en/dev/topics/i18n/timezones/#usage)),但這是一個罕見的用例。 –

+0

我認爲當我將時區設置爲「歐洲/哥本哈根」時,時區參考將自動設置爲UTC + 2。這就是讓我困惑的原因。 –