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
相关产品推荐
相关产品推荐

