2015-11-06 45 views
0

我想在我的django模型中將expire_time設置爲用戶選定日期的午夜,並且知曉時區。但我無法正確理解。任何人都可以告訴我我該怎麼做,或者我在代碼中犯了什麼錯誤?如何使午夜和時區的django模型日期時間字段數據知道?

我的代碼,

date = datetime.strptime(str(request.POST.get('expire') + ', 23:59:59'), 
            '%Y-%m-%d, %H:%M:%S') 
      tz = timezone.get_current_timezone() 
      date_tz = tz.localize(date) 
      createEventInDB.ev_expire = date_tz 

      try: 
       createEventInDB.save() 

      except Exception as e: 
       error = e 

所以,如果我選擇的日期是2015年12月1日,將它作爲發佈2015年12月1日

我想在數據庫中的數據保存像2015-12-01 23:59:59。我想給用戶一整天的時間。我目前的時區是美國/芝加哥。我已經通過ip設置了活動時區。所以我想讓它像用戶可以從任何地方發佈,但時區必須是UTC認識的,並在午夜過期。任何人都可以告訴我如何才能使它成爲可能?在數據庫UTC

+0

你怎麼知道你的代碼是錯誤的? – jfs

回答

1

基於文檔的https://docs.djangoproject.com/en/1.8/topics/i18n/timezones/

啓用對時區的支持,Django的店日期時間信息,使用時區感知datetime對象的內部,並將它們轉換爲結束用戶在模板和表單中的時區。

所以這一切都是不必要的,你需要做的就是像你一樣使用models.DateTimeField

您可以在視圖或表單定義Date小部件,在保存之前改變的DateTimeFieldTime後來就23:59:59(或者你可以提供它作爲默認)和Django會自動保存之前將其轉換爲UTC 。

+0

這是錯誤的:*「更改日期時間字段的時間後保存到23:59:59」* - 如果給定的時間和午夜使用不同的utc偏移量(例如,它們跨越DST過渡),那麼你得到一個錯誤由於未規範化的輸入,導致UTC時間(如果你調用'tz.normalize()',它不再對應於午夜)。請參閱[我如何獲得給定時區的「午夜」的UTC時間?](http://stackoverflow.com/q/373370/4279) – jfs

+0

這兩種解決方案都有所幫助,但我想要做的是'2015- 12-01 23:59:59 utc'在數據庫中。所以用戶有整個12月1日。或者我可以做的是'2015-12-02 00:00:00 utc' –

+0

@ J.F.Sebastian感謝您的鏈接,這很有幫助。 (並且你的用戶名太棒了。) – Behzad

1

我想要做的就是2015年12月1日23:59:59 UTC

你在問題中的代碼返回當前時區23:59:59

那麼就更簡單了,返回「23:59:59 UTC」,而不是給出了相應的UTC日期:

from datetime import datetime 
import pytz 

ev_expire = datetime(utc_date.year, utc_date.month, utc_date.day, 23, 59, 59, 
        tzinfo=pytz.utc) 
相關問題