首先要明確的是,當在Django項目的setting.py文件中設置了USE_TZ=True時,咱們給定的時間存儲到數據庫的時候都會變成UTC時間(使用auto_now_add和auto_now爲True的狀況會直接使用時間戳轉換成UTC時間保存到數據庫,而手動添加的datetime.datetime類型的時間會根據setting.py文件中設置的TIME_ZONE字段表示的時區轉換成對應的UTC時區時間,而後保存到數據庫中),此時這個時間也是一個aware時間,當咱們使用時間做爲查詢條件進行數據過濾的時候,django會根據setting.py中設置的TIME_ZONE的時區信息去轉換這個時間到UTC時間(若是你的查詢時間條件爲navie時間,那麼django會給出警告,可是仍是會嘗試把你給出的時間的時區信息轉換成setting.py文件中TIME_ZONE所標識的時區,而後在轉換成UTC時間做爲條件在數據庫中進行查詢,固然若是你給定的時間是一個aware時間,就不會給警告,直接轉換成UTC時間對數據庫進行查詢),而後再去數據庫篩選。若是想要把本地時間保存到數據庫中,須要設置USE_TZ=False,可是此時的時間就是navie時間:python
def now():
"""
Return an aware or naive datetime.datetime, depending on settings.USE_TZ.
"""
if settings.USE_TZ:
# timeit shows that datetime.now(tz=utc) is 24% slower
return datetime.utcnow().replace(tzinfo=utc) # 內部使用time.time()實現,與其餘設置無關
else:
return datetime.now()
一、navie時間和aware時間?
navie時間:不知道本身是哪一個時區的幼稚時間
aware時間:清醒的知道本身是哪一個時區的時間數據庫
二、pytz庫?
在python中用來處理時區時間的庫,下面簡介這個庫裏面的幾個方法:django
tz = pytz.timezone('時區'):定義一個時區信息,例如定義一箇中國時區就可使用:
c_tz = pytz.timezone('Asia/Shanghai')cookie
三、replace方法:
能夠替代時間元祖中各個元素的方法,固然也能夠用來指定當前時間的時區信息:
from datetime import datetime
now = datetime.now() # datetime中的時間是一個navie時間
asia_now = now.replace(tzinfo=pytz.timezone('Asia/Shanghai')) # 時間被轉換成aware時間spa
四、astimezone方法:
能夠將一個時區的時間轉換成另外一個時區的時間,前提是這個被轉換的時間必須是一個aware時間,使用方式以下:
utc_tz = pytz.timezone('UTC') # 定義一個時區的實例
from datetime import datetime
now = datetime.now() # datetime中的時間是一個navie時間
asia_now = now.replace(tzinfo=pytz.timezone('Asia/Shanghai')) # 時間被轉換成aware時間
utc_now = asia_now.astimezone(utc_tz) # 把一箇中國時區的時間轉換成utc時區時間源碼
五、在Django中使用aware時間:
首先,在setting.py文件中設置:
USE_TZ=Trueit
使用from django.utils.timezone import now中的now做爲當前時間,源碼以下:
def now():
"""
Return an aware or naive datetime.datetime, depending on settings.USE_TZ.
"""
if settings.USE_TZ:
# timeit shows that datetime.now(tz=utc) is 24% slower
return datetime.utcnow().replace(tzinfo=utc)
else:
return datetime.now()ast
此時,從now的定義中你就能夠知道只要在setting.py文件中設置了USE_TZ=True,此時的now就是一個aware時間import
注:若是你在django項目中使用USE_TZ=True,那麼你在項目中設置時間的時候就要注意了,一幫都會使用django.utils.timezone.make_aware先設置時間爲aware時間,而後再去進行設置查詢等操做(如設置cookie過時時間的expires參數date