django時區設置以及全球用戶如何各自顯示當地時間


 

  • 在Django的配置文件settings.py中,有兩個配置參數是跟時間與時區有關的,分別是TIME_ZONEUSE_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時間。

 

  1. 如果是中國用戶,不考慮時區問題,統一使用上海時間,則可以使用如下配置
# 時區設置,默認值為 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 后,處理時間方面,有兩條 “黃金法則”:

  1. 保證存儲到數據庫中的是 UTC 時間;
  2. 在函數之間傳遞時間參數時,確保時間已經轉換成 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/


免責聲明!

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



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