Django和Python中的Timezone處理


在現實環境中,存在有多個時區。用戶之間很有可能存在於不同的時區,並且許多國家都擁有自己的一套夏令時系統。所以如果網站面向的是多個時區用戶,只以當前時間為標准開發,便會在時間計算上產生錯誤。

為解決這個此類問題,在代碼和數據庫中統一使用 UTC 時間,僅在與最終用戶進行交互時使用本地時間是一個很好的辦法 。
Django 默認關閉時區支持,開啟時區支持,需要在 settings 中設置 USE_TZ = True 。

# TIME_ZONE = 'UTC'
TIME_ZONE = 'Asia/Shanghai'

最好同時安裝 pytz 模塊(pip install pytz) 。

Naive 和 Aware 類型的 datetime 對象

Python 的 datatime.datetime對象有一個 tzinfo 屬性,該屬性是 datetime.tzinfo 子類的一個實例,他被用來存儲時區信息。當某個 datetime 對象的 tzinfo 屬性被設置並給出一個時間偏移量時,我們稱該 datetime 對象是 aware (已知) 的。否則稱其為 naive (原生) 的。
可以使用 is_aware() 和 is_naive() 函數來判斷某個 datetime 對象是 aware 類型或 naive 類型。

  • 當關閉時區時,django 使用原生的 datetime 對象保存本地時間:
 import datetime
now = datetime.datetime.now()
  • 當開啟時區時,django 使用已知 (aware) 的 datetime 對象存儲本地時間:
from django.utils import timezone
now = timezone.now()

而默認Django開啟時區且為utc,所以在不改變TIME_ZONE的情況下,django數據庫中的時間一定是timezone aware的時間,如果要生成時間,要通過replace timezone設置為本地時區。

數據庫中的時間都是utc時間
Django中的timezone

from django.utils import timezone
     t=timezone.now()
     print(t)
datetime.datetime(2016, 1, 4, 2, 13, 54, 582231, tzinfo=<UTC>)
    new_t=timezone.localtime(t)
    print(new_t)
datetime.datetime(2016, 1, 4, 10, 13, 54, 582231, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>)

Python中的datetime

import datetime
    t = datetime.datetime.strptime("2016-1-4", "%Y-%m-%d")
    print(t)
datetime.datetime(2016, 1, 4, 0, 0)
    new_t = t.replace(tzinfo=(pytz.timezone('Asia/Shanghai')))
    print(new_t)
datetime.datetime(2016, 1, 4, 0, 0, tzinfo=<DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD>)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM