django時區(qū)問題的處理(USE_TZ)
一:Django出現(xiàn)的時間問題
問題描述:
不同時區(qū)的人所在的時間是不同的,如果都采用當?shù)貢r間,那么導致數(shù)據(jù)庫存儲的時間,并不是同一時刻的時間。但如果都采用0時區(qū)時間,那么不在0時區(qū)的用戶就會看到錯誤的時間,怎么做呢?
解決方案:
在代碼和數(shù)據(jù)庫中都采用UTC時間(0時區(qū)時間),在和用戶交互的時候采用當?shù)貢r間。
二:Django如何開啟時區(qū)支持?
1: 在配置文件中配置:
USE_TZ = True
2: 配置文件指定自己所在的時間戳(不指定默認是0時區(qū))
LANGUAGE_CODE = 'zh-hans' # 語言:簡體中文 TIME_ZONE = 'Asia/Shanghai' # 亞洲上海
3: 安裝pytz模塊:(時區(qū)轉(zhuǎn)換專用模塊)
pip install pytz -i https://pypi.tuna.tsinghua.edu.cn/simple
三:USe_TZ = True的效應(yīng)
- 作用一:前端傳遞過來的DateFiled類型,經(jīng)過模型類,存到數(shù)據(jù)庫中,全部是0時區(qū)時間。
- 作用二: 后端自己寫的代碼,只要是使用timezone獲取的時間(已知的時間)(帶時區(qū)的時間),django會自己轉(zhuǎn)換,無需我們手動轉(zhuǎn)換。
- 作用三:模板顯示問題:django模板,會將數(shù)據(jù)庫中0時區(qū)的時間轉(zhuǎn)換成當?shù)貢r間,無需我們自己轉(zhuǎn)換。
總結(jié):
- 1:django中推薦使用USE_TZ = True,讓數(shù)據(jù)庫存儲0時區(qū)時間。
- 2:django后端使用timezone獲取當?shù)貢r間,不使用原生的datetime。
- 3:django模板無需考慮時區(qū)問題,django將自動轉(zhuǎn)換。
- 4:USE_TZ = True,和 TIME_ZONE = ‘Asia/Shanghai’ # 亞洲上海必須設(shè)置。
四:了解django的配置文件
1:如果在沒有django項目的情況下,django使用的自己的配置文件。
python3.5.2/site_packages/django/conf/global_settings
在django項目的依賴包中尋找到。
2: django項目下,django啟動的是
項目中的settings文件
五:區(qū)分兩類datetime對象
- 時區(qū)關(guān)閉時,django使用原生的datetime對象保存本地時間。
- 時區(qū)開啟時,django使用已知的datetime對象保存本地時間。
驗證:時區(qū)關(guān)閉時:django使用的timezone
注意:此時使用的是global_settings配置文件,不存在USE_TZ = True這個配置項。
python@ubuntu:~$ workon django_env (django_env) python@ubuntu:~$ python3 >>> from django.conf import settings >>> settings.configure() >>> from django.utils import timezone >>> now = timezone.now() >>> now datetime.datetime(2020, 10, 27, 21, 34, 48, 517250)
結(jié)論:
當關(guān)閉時區(qū)時,django 使用原生的 datetime 對象保存本地時間。
驗證:時區(qū)開啟時:django使用的timezone
注意:
此時我們進入django項目中使用python3 manager.py shell進入django環(huán)境:
(django_env) python@ubuntu:~/Desktop/shopping-mall-project/shopping_mall$ python3 manage.py shell >>> from django.utils import timezone >>> now = timezone.now() >>> now datetime.datetime(2020, 10, 27, 13, 40, 35, 544740, tzinfo=<UTC>) >>> new = timezone.localtime() >>> new datetime.datetime(2020, 10, 28, 8, 24, 1, 906910, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>)
結(jié)論:
時區(qū)開啟時,django使用已知的datetime對象保存本地時間。
使用localtime獲取的是本地東八區(qū)的時間。(注意:,TIME_ZONE = ‘Asia/Shanghai’, 這個配置項必須存在才可以)。
六:datetime模塊中的類
date類: 日期對象(年,月,日)time類:時間對象(時,分, 秒,微秒)datetime類:日期時間對象 (年,月,日,時,分,秒,微秒)timedelta類:時間間隔對象tzinfo類:時區(qū)信息對象。
七:datetime的常見用法
注意: 由于timezone返回的對象也是datetime對象,所以方法同樣試用。
- 1:獲取當?shù)厥菚r間(年,月,日,時,分,秒,微秒):
>>> datetime.datetime.now() datetime.datetime(2020, 10, 28, 8, 34, 56, 588940)
>>> today = datetime.datetime.today() >>> today datetime.datetime(2020, 10, 28, 8, 50, 34, 43761)
- 2:將時間轉(zhuǎn)換成(時,分,秒,微秒)
>>> new_time = datetime.datetime.now() >>> new_time.time() datetime.time(8, 38, 24, 280548)
- 3:將時間轉(zhuǎn)換成(年,月,日)
>>> now_time = datetime.datetime.now() >>> now_time.date() datetime.date(2020, 10, 28)
- 4:時間的加減計算:
# 時間點-時間間隔 = 時間點 >>> import datetime >>> now_time = datetime.datetime.now() >>> now_time datetime.datetime(2020, 10, 28, 8, 47, 30, 232944) >>> day_3_ago = now_time - datetime.timedelta(days = 3) >>> day_3_ago datetime.datetime(2020, 10, 25, 8, 47, 30, 232944)
- 5:格式化日期轉(zhuǎn)換成datetime對象:
>>> datetime.datetime.strptime('2017-3-22 15:25','%Y-%m-%d %H:%M')
datetime.datetime(2017, 3, 22, 15, 25)
八:date的常用用法
- 1: date對象獲取年月日:
>>> date_today = datetime.date.today() >>> date_today datetime.date(2020, 10, 28) >>> date_today.year 2020 >>> date_today.month 10 >>> date_today.day 28
- 2:日期比較大小
>>> a = datetime.date(2020, 10, 28) >>> b = datetime.date(2020, 10, 27) >>> a.__eq__(b) # 相等 False >>> a.__gt__(b) # 大于 True >>> a.__lt__(b) # 小于 False >>> a.__le__(b) # 小于等于 False >>> a.__lt__(b) # 大于等于 False >>> a.__ne__(b) # 不等于 True
- 3:replace替換:
>>> today_date = datetime.date.today() >>> today_date datetime.date(2020, 10, 28) >>> today_date = today_date.replace(year = today_date.year, month = today_date.month, day = 3) >>> today_date datetime.date(2020, 10, 3)
九:Django的時區(qū)轉(zhuǎn)換
1:astimezone的使用:將一個時間對象(datetime)轉(zhuǎn)換成UTC時間對象(datetime)
import datetime
import pytz
utc = pytz.timezone('UTC')
now_time = datetime.datetime.now()
utc_time = now_time.astimezone(tz=utc)
print(now_time,utc_time)
2:pytz.timezone(‘時區(qū)名’):此方法能獲取一個tzinfo對象,該對象可在datetime生成時間中以參數(shù)的形式放入,即可生成對應(yīng)時區(qū)的時間。
>>>utc = pytz.timezone('UTC')
>>>datetime.datetime.now(tz=utc)
2019-05-10 10:53:46.000929+00:00
實際的時間是:18:53:46
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
python之PyQt按鈕右鍵菜單功能的實現(xiàn)代碼
這篇文章主要介紹了python PyQt按鈕右鍵菜單功能的實現(xiàn)代碼,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2019-08-08
Python和Anaconda和Pycharm安裝教程圖文詳解
PyCharm是一種PythonIDE,帶有一整套可以幫助用戶在使用Python語言開發(fā)時提高其效率的工具,這篇文章主要介紹了Python和Anaconda和Pycharm安裝教程,需要的朋友可以參考下2020-02-02
Python 3.x基礎(chǔ)實戰(zhàn)檢查磁盤可用空間
這篇文章主要為大家介紹了Python 3.x基礎(chǔ)實戰(zhàn)之檢查磁盤可用空間實現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-05-05
Python利用SMTP發(fā)送郵件的常見問題與解決方案詳解
在自動化辦公和系統(tǒng)開發(fā)中,郵件發(fā)送功能是常見的需求,本文將從實際案例出發(fā),分析常見的SMTP錯誤,并提供完整的解決方案,希望對大家有一定的幫助2025-04-04
使用Keras中的ImageDataGenerator進行批次讀圖方式
這篇文章主要介紹了使用Keras中的ImageDataGenerator進行批次讀圖方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06

