You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django Rest Framework字符串Datetime存入数据库时区异常问题

问题原因与解决方案

核心原因

你遇到的时间偏差问题,完全是Django时区机制导致的:

  • 当USE_TZ = True时,Django要求所有DateTimeField的时间值要么是带时区信息的aware datetime对象,要么会被默认视为UTC时间处理。
  • 你传入的2022-10-04 15:57:18是不带时区的字符串,Django自动把它当成UTC时间。而迪拜时区(Asia/Dubai)是UTC+4,所以存储到数据库时会转成UTC时间:15:57 - 4小时 = 11:57,这就是数据库里显示的时间。
  • auto_now_add=True的字段同理:Django会基于TIME_ZONE获取当前本地时间,但存储时会转成UTC时间,直接查看数据库原始值自然和你预期的迪拜时间不符。

解决办法

1. 传入带时区的时间对象

不要直接传字符串,构造带迪拜时区的datetime对象再存入:

# Python 3.9+ 用zoneinfo
from zoneinfo import ZoneInfo
import datetime

dt_str = '2022-10-04 15:57:18'
dt = datetime.datetime.strptime(dt_str, '%Y-%m-%d %H:%M:%S').replace(tzinfo=ZoneInfo('Asia/Dubai'))

# 赋值给模型字段
stock_price = StockPriceModel(
    ticker='XYZ',
    last_price=394.05,
    last_date_time=dt
)
stock_price.save()

2. 通过ORM读取时间(而非直接查数据库)

不管存储时是UTC还是本地时间,用Django ORM取出数据时,Django会自动将UTC时间转换为TIME_ZONE配置的迪拜时区时间,此时你看到的last_date_time就是正确的15:57。

3. 不推荐:关闭时区支持(仅单时区场景可用)

如果你的业务完全不需要多时区支持,可以将settings.py中的USE_TZ改为False,这样Django会直接存储本地时间,不再进行时区转换。但这种方式会丧失Django的时区处理能力,后续扩展多时区会非常麻烦。

内容的提问来源于stack exchange,提问作者Sid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 10:41:18