目錄· Django 中與時(shí)區(qū)有關(guān)的配置 · Linux 容器中時(shí)區(qū)的設(shè)置 · 進(jìn)入 Django 環(huán)境查看時(shí)間和時(shí)區(qū) · 進(jìn)入 Django 環(huán)境查看時(shí)間 · 總結(jié) 現(xiàn)在容器化部署已經(jīng)非常成熟了,我們很多服務(wù)都會(huì)使用容器部署,更新恢復(fù)都非常方便,但是有一個(gè)問題比較麻煩,就是時(shí)區(qū)處理,通常情況下,都采用注入 TZ 環(huán)境變量來(lái)解決,但是實(shí)際這種處理方式在 django 中卻是不行的。 Django 中與時(shí)區(qū)有關(guān)的配置在Django的配置文件 settings.py 中,有兩個(gè)配置參數(shù)是跟時(shí)間與時(shí)區(qū)有關(guān)的,分別是TIME_ZONE和USE_TZ。我們期望著通過在 settings.py 中配置以后,Django 就能正確地獲取本地時(shí)間,但是實(shí)際上卻事與愿違,我們看一看這兩個(gè)設(shè)置有什么作用。 USE_TZ=True如果 USE_TZ 設(shè)置為 True 時(shí),Django 會(huì)使用系統(tǒng)默認(rèn)設(shè)置的時(shí)區(qū),此時(shí)的 TIME_ZONE 的設(shè)置基本是無(wú)效的,也就是無(wú)論有沒有設(shè)置都不起作用。 USE_TZ=False如果 USE_TZ 設(shè)置為 False 1. TIME_ZONE 設(shè)置為 None 2. Django 還是會(huì)使用默認(rèn)的時(shí)區(qū) 3. 若 TIME_ZONE 設(shè)置為其它時(shí)區(qū)的話 如果是 Windows 系統(tǒng),則 TIME_ZONE 設(shè)置是沒用的,Django會(huì)使用本機(jī)的時(shí)間 例如設(shè)置 USE_TZ = False, TIME_ZONE = 'Asia/Shanghai', 則使用上海的 UTC 時(shí)間。 到這一步,可能你會(huì)認(rèn)為時(shí)間已經(jīng)好了,但是實(shí)際上還沒有,我們還需要關(guān)注系統(tǒng)時(shí)區(qū)的設(shè)置。 Linux 容器中時(shí)區(qū)的設(shè)置現(xiàn)在我本地時(shí)間是:16:15,Django 中設(shè)置為:USE_TZ = False, TIME_ZONE = 'Asia/Shanghai' 不注入 TZ=Asia/Shanghai 環(huán)境變量
系統(tǒng)時(shí)間顯示的是 UTC 時(shí)區(qū),時(shí)間為:08:15,剛好差 8 個(gè)小時(shí) 進(jìn)入 Django 環(huán)境查看時(shí)間和時(shí)區(qū)
注入環(huán)境變量 TZ=Asia/Shanghai
系統(tǒng)時(shí)間顯示的是 Asia 時(shí)區(qū),但是時(shí)間依然是 UTC 時(shí)間,并沒有顯示真正的本地時(shí)間 進(jìn)入 Django 環(huán)境查看時(shí)間和時(shí)區(qū)
可以看到,雖然時(shí)區(qū)變了,但是時(shí)間卻還是 UTC 時(shí)間,無(wú)論是容器本身還是 Django 中 通過在網(wǎng)上查詢,我們知道修改 Linux 系統(tǒng)時(shí)區(qū)要修改 /etc/localtime 文件 修改 Linux 容器時(shí)區(qū)通常的做法是將宿主機(jī)的 /etc/localtime 文件拷貝到容器的 /etc/localtime 文件,但是我們通過查詢發(fā)現(xiàn) /etc/localtime 文件實(shí)際只是一個(gè)軟連接,實(shí)際的文件是:/usr/share/zoneinfo/Asia/Shanghai docker cp /usr/share/zoneinfo/Asia/Shanghai test:/etc/localtime
如果注入了 TZ=Asia/Shanghai 環(huán)境變量,即使把 /etc/localtime 文件替換了,也只是時(shí)區(qū)改變了,時(shí)間依然是 UTC 時(shí)間 進(jìn)入 Django 環(huán)境查看時(shí)間
Linux 系統(tǒng)時(shí)間已經(jīng)正常了,但是 Django 環(huán)境中的時(shí)間還是不正確,依然是 UTC 時(shí)間,這時(shí)候很多人就有點(diǎn)抓狂了,可能覺得是 settings.py 中的 USE_TZ 和 TIME_ZONE 設(shè)置有問題,其實(shí)問題并不在這里。原因是因?yàn)?datetime 庫(kù)會(huì)去 /usr/share/zoneinfo/ 目錄下尋找 Asia/Shanghai 這個(gè)文件,而我們的鏡像中不包含這個(gè)目錄,所以 Django 還是使用了 UTC 時(shí)區(qū)。解決的辦法非常簡(jiǎn)單:創(chuàng)建 /usr/share/zoneinfo/Asia 目錄,拷貝文件到這個(gè)目錄下就行了
然后登錄到容器內(nèi),進(jìn)入 Django 環(huán)境下查看時(shí)間
這下時(shí)間就完全正確了。 總結(jié)對(duì)于容器時(shí)區(qū)的問題,建議在容器制作階段,安裝并設(shè)置好 /etc/localtime,例如在 dockerfile 中添加如下語(yǔ)句
這樣我們的容器在啟動(dòng)時(shí)就無(wú)需關(guān)注時(shí)區(qū)問題了,如果容器已經(jīng)制作好了,在啟動(dòng)的時(shí)候掛載一下時(shí)區(qū)文件
這種方式就比較麻煩。還有一種情況就是我們現(xiàn)在碰到的,服務(wù)已經(jīng)上線了,發(fā)現(xiàn)時(shí)間有問題,就手動(dòng)拷貝一下那兩個(gè)文件到容器中,然后重啟一下容器
|
|
來(lái)自: 新用戶3488XG6a > 《待分類》