Django和Mysql合用時,顯示時間問題

2021-09-07 19:32:47 字數 3780 閱讀 7540

這個以前沒系統處理過,感覺前端頁面顯示正常,就ok。

但有的不重要的地方,顯示有8小時錯亂,也沒有列入優先順序處理。

昨天下細看了一些網上文件,找取了解決思路。

具體到django+mysql來說:

會關係到mysql的作業系統時區(mysql會讀取這個設定,形成system_time_zone)  system_time_zone | cst,

mysql的時區: time_zone        +00:00

django框架的四個設定:

time_zone = 'asia/shanghai'

use_i18n = true

use_l10n = true

use_tz = true

show variables like

'%time_zone%';

select

now();

set time_zone=

'+00:00';

set time_zone=

'system

';

作業系統輸出:

# date

fri aug

1010:46:56 cst 2018

在此先說明一下,我所用的資料庫時 cst 時區,與所在的伺服器系統時間一致,django 所在的 web 伺服器也是統一臺機器。在之前使用的過程中,從 django 中獲取到的 localtime 儲存到資料庫時會被系統自動處理增加8小時。針對這一問題,蒐集了各方面的資料。下面就對 django 的時區機制作個解釋。

其實,django 在配置檔案 settings.py 中對時間時區有影響的是兩個引數,乙個是 time_zone,另乙個是 use_tz。根據use_tz 官網文件中的描述,這一屬性預設值是 false。如果設定為 ture,django 內部將會使用對時區敏感的時間,否則 django 將會使用系統本地的原有時間。(注意:為了方便,由 django-admin.py startproject 建立而來的專案 settings.py 中此項值設定為了 ture)

與這一屬性相關的還有 time_zone, use_i18n 和 use_l10n,下面我們來看一下這幾個屬性。

time_zone 官方文件中說,在 django 1.4 以後的版本中,這一屬性值的意義是由 use_tz 決定的。這並不是伺服器必須的,因為乙個伺服器可以服務多個 django 框架的服務,並擁有各自的時區。

首先說明一點,在開啟了 django 所有關於時區的設定之後,本來以為 django 將會以 utc 標準時區連線資料庫,但是經筆者測試(在 django 中引入 django.db.connection 連線做查詢)發現實際連線的時區是資料庫系統的全域性設定。確認這一點十分關鍵,因為它事關全部時間資料的時區問題。

如下是做的一些測試以說明問題。

操作引數

情形1情形2

情形3情形4

情形5django settings.py

time_zone

asia/shanghai

asia/shanghai

asia/shanghai

asia/shanghai

asia/shanghai

use_i18n

true

true

true

true

true

use_l10n

true

true

true

true

true

use_tz

true

false

false

true

false

datetime_format

y-m-j h:i:s z

y-m-j h:i:s z

y-m-j h:i:s z

y-m-j h:i:s z

y-m-j h:i:s z

database time_zone

system_time_zone

china standard time

china standard time

china standard time

china standard time

china standard time

time_zone

system

system

+00:00

+00:00

+00:00

存入time.strftime('%y-%m-%d %x', time.gmtime()) or time.strftime('%y-%m-%d %x', time.localtime())

2014-08-27 23:43:19+08:00

2014-08-27 23:45:27

2014-08-27 15:48:56

2014-08-27 15:50:49+00:00

2014-08-27 15:50:49+00:00

在資料庫中查詢set time_zone = '+00:00'

datetime

2014-08-27 15:43:19

2014-08-27 23:45:27

2014-08-27 15:48:56

2014-08-27 15:50:49

2014-08-27 15:50:49

timestamp

2014-08-27 07:43:19

2014-08-27 15:45:27

2014-08-27 15:48:56

2014-08-27 15:50:49

2014-08-27 15:50:49

在 django 中讀取

datetime

2014-08-27 15:43:19+00:00

2014-08-27 23:45:27

2014-08-27 15:48:56

2014-08-27 15:50:49+00:00

2014-08-27 15:50:49

timestamp

2014-08-27 15:43:19

2014-08-27 23:45:27

2014-08-27 15:48:56

2014-08-27 15:50:49

2014-08-27 15:50:49

在 template 中顯示

datetime

2014-8-27 23:43:19 28800

2014-8-27 23:45:27 28800

2014-8-27 15:48:56 28800

2014-8-27 23:50:49 28800

2014-8-27 15:50:49 28800

timestamp

2014-8-27 15:43:19 28800

2014-8-27 23:45:27 28800

2014-8-27 15:48:56 28800

2014-8-27 15:50:49 28800

2014-8-27 15:50:49 28800

由此可見,使用情形4的配置,設定 use_tz = ture,資料庫 time_zone = '+00:00',時間設定為 time.strftime('%y-%m-%d %x', time.gmtime()),可以加時區 '+00:00'(資料庫不會關心),在資料庫中採用 datetime 型別儲存最為合適。

django專案中有多個應用時如何整理和配置

3.在專案setting.py檔案中增加如下配置 import sys5.在專案的urls.py檔案中也可以直接寫 urlpatterns url r user include user.urls namespace user 使用者模組 url r cart include cart.urls n...

js中for迴圈和splice合用

在js中對陣列的處理是司空見慣的,現在想要刪除陣列中choiceflag為1的元素,可以這樣做。for var i 0 i scope.macco.items.length i 這裡的神奇之處就是合理使用splice函式,下面是對splice的介紹 splice 方法向 從陣列中新增 刪除專案,然後...

django使用mysql和MongoDB的配置

今天整理了一下在django專案中如何使用mongodb,環境如下 ubuntu18.04,django2.0.5,drf3.9,mongoengine0.16 第一步 在settings.py中配置mongodb和mysql,配置如下 可以同時使用mysql和mongodb databases m...