天天看點

Django 時區問題處理

問題:存儲、搜尋、展示資料不一緻。如何解決和處理那?

設定 ( Django 1.4 之後存在時區問題)

# Django 設定 東八區 settings.py
USE_TZ = True
TIME_ZONE = 'Asia/Shanghai'
           

是否開啟時區

  • 使用 Django 開發項目,DateTime 存在跨區開啟時區。否則,建議不開啟時區,開啟時區意味你要在。存儲、查詢、格式化DateTime做對應處理。下面會講到

關于時區

  • 中國時區(東八區)使用國際時區 UTC。國際通用也是 UTC 。
  • 北美、歐洲使用 CST (夏令時。中間有個“有趣”的故事可以搜一下)

Django 時區

ORM 實操

ORM 存儲

frm datetime import datetime
import pytz
from dateutil.parser import parse

tz = pytz.timezone('Asia/Shanghai')

now = datetime.now() # 沒有攜帶時區

dt = parse('2022-10-24 14:10:00')
dt.astimezone(pytz.utc)
# Django開啟 東八區後存儲 Django将轉換後的資料存儲到資料中
Out[31]: datetime.datetime(2022, 10, 24, 6, 10, tzinfo=<UTC>)

# 準确來說應該是這樣的
tz = pytz.timezone('Asia/Shanghai')
dt_tz = tz.localize(dt)
dt_tz.astimezone(pytz.utc)
Out[33]: datetime.datetime(2022, 10, 24, 6, 10, tzinfo=<UTC>)


Model.objects.create(at='2022-10-24 16:30:00')
# 資料中得到的結果應該是
# 2022-10-24 08:30:00+00
           

ORM 查詢

Model.objects.filter(at__gt='2022-10-24 16:30:00')
Model.objects.filter(at__range=('2022-10-24 00:00:00', '2022-10-24 16:30:00')

# Django SQL
# "at" > 2022-10-24 16:30:00+08:00
# BETWEEN 2022-10-24 00:00:00+08:00 AND 2022-10-24 16:30:00+08:00'


# 将 2022-10-24 16:30:00 轉成時區為 上海時區 utc 
"alert_end_time" > 2022-10-24 08:30:00+00:00'
           

ORM DateTime strftime格式化

# 資料庫讀取結果是一個 utc datetime 後端格式化時結果和存儲正好錯 8 小時
datetime.datetime(2022, 10, 24, 8, 30, tzinfo=<UTC>)
obj.alert_end_time.strftime('%Y-%m-%d %H:%M:%S')
Out[42]: '2022-10-24 08:30:00'

# 轉化時區格式化
_dt.astimezone(tz).strftime('%Y-%m-%d %H:%M:%S')
Out[47]: '2022-10-24 16:30:00'
           

總結