- 在Django的配置文件
settings.py
中,有兩個配置參數是跟時間與時區有關的,分別是TIME_ZONE
和USE_TZ
- 如果
USE_TZ
設置為True
時,Django會使用系統默認設置的時區,即America/Chicago
,此時的TIME_ZONE
不管有沒有設置都不起作用。
- 如果
USE_TZ
設置為False
,而TIME_ZONE
設置為None
,則Django還是會使用默認的America/Chicago
時間。若TIME_ZONE
設置為其它時區的話,則還要分情況,如果是Windows系統,則TIME_ZONE
設置是沒用的,Django會使用本機的時間。如果為其他系統,則使用該時區的時間,如設置USE_TZ = False
,TIME_ZONE = 'Asia/Shanghai'
, 則使用上海的UTC
時間。
- 如果是中國用戶,不考慮時區問題,統一使用上海時間,則可以使用如下配置
# 時區設置,默認值為 USE_TZ = True,如果不設置為False,即使設置TIME_ZONE = 'Asia/Shanghai',也會差8個小時 # USE_TZ = True USE_TZ = False # TIME_ZONE = 'UTC' TIME_ZONE = 'Asia/Shanghai'
2.如果面向全球用戶,則必須考慮時區問題,則可以使用如下配置
# 時區設置,默認值為 USE_TZ = True,如果不設置為False,即使設置TIME_ZONE = 'Asia/Shanghai',也會差8個小時 # USE_TZ = False # TIME_ZONE = 'Asia/Shanghai' # 使用utc時間,前端根據時區自動顯示當地時間 USE_TZ = True TIME_ZONE = 'UTC'
這樣存入mysql數據庫的時間則是utc時間,但是不是utc格式,所以在返回給前端時,需要做utc格式轉換:
class ModifyTimeStyle(serializers.CharField): def to_representation(self, value): # return value.strftime('%Y-%m-%d %H:%M:%S') # 由於mysql里存儲的是utc時間,但是不是utc格式的時間, # 所有這里需要返回給前端utc格式的時間,方便前端根據utc時間自動轉換為當地時間 return value.strftime('%Y-%m-%dT%H:%MZ')
在前端的react代碼里,再根據utc時間,轉換為當地時間:
import moment from 'moment';
// 根據所屬時區,自動顯示當前位置對應的時間 let localTime = moment.utc(modelData.gmt_modify).toDate(); localTime = moment(localTime).format("YYYY-MM-DD HH:mm:ss"); this.modifyTime = localTime;
啟用 USE_TZ = True
后,處理時間方面,有兩條 “黃金法則”:
- 保證存儲到數據庫中的是 UTC 時間;
- 在函數之間傳遞時間參數時,確保時間已經轉換成 UTC 時間;
比如,通常獲取當前時間用的是:
import datetime
now = datetime.datetime.now()
啟用 USE_TZ = True
后,需要寫成:
import datetime from django.utils.timezone import utc now = datetime.datetime.utcnow().replace(tzinfo=utc)
保證 now
變量存放的是 UTC 時間。
這樣修改完,中國的日志輸出時間也是utc時間,所以后台顯示的也是utc時間,需要轉換為中國北京時間,修改方法是在settings.py里添加:
def beijing(sec, what): beijing_time = datetime.datetime.now() + datetime.timedelta(hours=8) return beijing_time.timetuple() logging.Formatter.converter = beijing
參考:
https://www.cnblogs.com/brad1994/p/6761110.html
http://momentjs.cn/docs/
https://blog.csdn.net/brucewong0516/article/details/81100242
https://docs.djangoproject.com/en/2.2/topics/i18n/timezones/