Django和Python中的Timezone處理

在現實環境中,存在有多個時區。用戶之間頗有可能存在於不一樣的時區,而且許多國家都擁有本身的一套夏令時系統。因此若是網站面向的是多個時區用戶,只以當前時間爲標準開發,便會在時間計算上產生錯誤。python

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

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

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

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中的timezonecode

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>)
相關文章
相關標籤/搜索