在現實環境中,存在有多個時區。用戶之間很有可能存在於不同的時區,並且許多國家都擁有自己的一套夏令時系統。所以如果網站面向的是多個時區用戶,只以當前時間為標准開發,便會在時間計算上產生錯誤。
為解決這個此類問題,在代碼和數據庫中統一使用 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>)