Django数据库时间操作怎么用?时间数据怎么存储和处理?

文章导读
在 Django 中操作数据库时间主要使用 DateTimeField 字段类型,配合 USE_TZ 配置进行时区管理。存储时建议开启 USE_TZ=True,使数据库统一存储 UTC 时间,避免夏令时和多时区问题。获取时间应使用 django.utils.timezone.now() 而非 datetime.now() 以确保时区感知。前端显示时,Django 模板会自动将 UTC 时间转换为用
📋 目录
  1. Django 框架数据库 (mysql) 存储时间 DateTimeField 的用法
  2. Python Django 怎么处理时区_USE_TZ 全局设置 True 与数据库 UTC 存储到前端本地时间转换
  3. django 时区问题的处理 (USE_TZ)
  4. django:DateTimeField 如何自动设置为当前时间并且能被修改 ——django 日期时间字段的使用
  5. FAQ
A A

在 Django 中操作数据库时间主要使用 DateTimeField 字段类型,配合 USE_TZ 配置进行时区管理。存储时建议开启 USE_TZ=True,使数据库统一存储 UTC 时间,避免夏令时和多时区问题。获取时间应使用 django.utils.timezone.now() 而非 datetime.now() 以确保时区感知。前端显示时,Django 模板会自动将 UTC 时间转换为用户本地时区。对于自动更新时间,可使用 auto_now 和 auto_now_add 参数,若需可修改的默认当前时间,则使用 default=timezone.now。

Django 框架数据库 (mysql) 存储时间 DateTimeField 的用法

在数据库中存储时间虽然用字符串或者分下来用数字存储就可以解决问题,但是这样要么就是存储空间浪费,要么就是对于时间的运算操作效率很低。而数据库本身就自带了专门存储时间的类型,那在 Django 框架下如何用数据库存储时间数据呢?在 mysql 里面有个 datetime 类型,在 Django 的 ORM 语言里面对应的类是 DateTimieField。下面就来介绍它的使用方法。一、存储一个时间数据 首先,声明方式:createDate = models.DateTimeField(auto_now_add =True) AI 写代码 python 运行 那这个 createDate 字段的类型就是 datetime 类型。这里创建的时候有两个参数 auto_now_add 和 auto_now,它们默认都是 False,他们的区别如下:设置为 true 时,能够在保存该字段时,将其值设置为当前时间,并且每次修改 model,都会自动更新。因此这个参数在需要存储“最后修改时间”的场景下,十分方便。需要注意的是,设置该参数为 true 时,并不简单地意味着字段的默认值为当前时间,而是指字段会被“强制”更新到当前时间,你无法程序中手动为字段赋值;如果使用 django 自带的 admin 管理器,那么该字段在 admin 中是只读的。设置为 true 时,auto_now_add 会在 model 对象第一次被创建时,将字段的值设置为创建时的时间,以后修改对象时,字段的值不会再更新。该属性通常被用在存储“创建时间”的场景下。与 auto_now 类似,auto_now_add 也具有强制性,一旦被设置为 True,就无法在程序中手动为字段赋值,在 admin 中字段也会成为只读的。有一点要注意的是,auto_now_add 默认是 UTC(可以查看 settings.py 内 TIME_ZONE 的设置) 时间,即国际标准时间我们是东 8 区,所以看到的是比当前时间要晚 8 个小时。这个问题的解决办法是:settings.py 中修改:TIME_ZONE = 'Asia/Shanghai' 这样存入的时间就是东 8 区的时间了。然后就是存储一个数据的时候,因为之前设置了 auto_now_add =True,所以我们设置的时候设置属性为 None 即可:然后看看后台:没有问题。二、DateTimeField 类型字段数据的获取和常用使用方法 它的用法就和 python 的 datetime 类似。我们可以获取一个记录看看:运行的结果是:那用法就和 datetime.datetime 一样了 print("年:"+str(obj.createTime.year)+"月:"+str(obj.createTime.month)+"日:"+str(obj.createTime.day)+"时:"+str(obj.createTime.hour)+"分:"+str(obj.createTime.minute)+"秒:"+str(obj.createTime.second))(该信息的时间戳是 2022 年 10 月 22 日)

Python Django 怎么处理时区_USE_TZ 全局设置 True 与数据库 UTC 存储到前端本地时间转换

Django 在 USE_TZ=True 时,所有 datetime 字段存入数据库前均转为 UTC:带时区对象直接转 UTC,naive 时间按 TIME_ZONE 解释后再转;务必用 timezone.now() 而非 datetime.now(),外部输入需显式绑定时区。USE_TZ=True 时 Django 怎么存时间到数据库 Django 在 USE_TZ=True 下,所有 datetime 字段 (如 DateTimeField) 接收的值会被自动转成 UTC 后存入数据库。哪怕你传的是带本地时区的 datetime 对象,Django ORM 也会先调用.astimezone(timezone.utc) 再保存;如果传的是"naive"时间 (没时区),Django 会按 TIME_ZONE 配置当作本地时间解释,再转 UTC 存。常见错误现象:ValueError: Can't localize naive datetime—— 多出现在模板里用{{ obj.created_at|date }}但 created_at 是 naive 时间且 USE_TZ=True;或者你在 shell 里手动创建对象时写了 datetime.now() 而不是 timezone.now()。始终用 timezone.now() 替代 datetime.now() 创建带时区的时间 从外部 (如 API、表单) 接收时间字符串时,用 parse_datetime() 或 make_aware() 显式绑定时区,别直接 strptime 数据库里看到的 2024-05-20 12:00:00+00 是 UTC,不是服务器本地时间 —— 别误以为它“错了”前端显示怎么变成用户本地时间 (不靠 JS) Django 模板层能自动把 UTC 时间转成请求用户的本地时区,前提是开启中间件和正确设置 TIME_ZONE,且用户时区已知。使用场景:用户登录后设置了个人时区 (比如存在 user.timezone 字段),或通过 pytz/zoneinfo 解析请求头里的 Accept-Language 或 IP 地理位置 (不推荐自动猜)。在视图里用 timezone.activate(user.timezone) 激活用户时区,之后所有模板过滤器 (如|date、|time) 都会基于该时区渲染 确保 MIDDLEWARE 包含'django.contrib.auth.middleware.AuthenticationMiddleware'和自定义的时区激活中间件 (比如读取用户 profile) TIME_ZONE 配置只是 fallback,默认时区,不是全局生效的“显示时区”为什么 model.save() 后取出来时间看起来“变慢了 8 小时”这是最常被误解的现象:数据库里存的是 UTC,而你用 python manage.py dbshell 直接查,看到的是原始 UTC 值;但你在 shell 或 admin 里打印 obj.updated_at,Django 默认会调用__str__并触发本地化 (按 TIME_ZONE 或当前激活时区转),所以看起来“变了”。本质是显示逻辑不同,不是数据错了。性能影响:每次访问 datetime 字段属性时,Django 都会做一次时区转换 (如果未激活时区,则用 TIME_ZONE)。(来自 2026 年 3 月 15 日的资料)

django 时区问题的处理 (USE_TZ)

一:Django 出现的时间问题 问题描述:不同时区的人所在的时间是不同的,如果都采用当地时间,那么导致数据库存储的时间,并不是同一时刻的时间。但如果都采用 0 时区时间,那么不在 0 时区的用户就会看到错误的时间,怎么做呢?解决方案:在代码和数据库中都采用 UTC 时间 (0 时区时间),在和用户交互的时候采用当地时间。二:Django 如何开启时区支持?1: 在配置文件中配置:1 USE_TZ =True 2: 配置文件指定自己所在的时间戳 (不指定默认是 0 时区) 1 2 3 LANGUAGE_CODE ='zh-hans'# 语言:简体中文 TIME_ZONE ='Asia/Shanghai'# 亚洲上海 3: 安装 pytz 模块:(时区转换专用模块) 1 pip install pytz -i https://pypi.tuna.tsinghua.edu.cn/simple 三:USe_TZ = True 的效应 作用一:前端传递过来的 DateFiled 类型,经过模型类,存到数据库中,全部是 0 时区时间。作用二:后端自己写的代码,只要是使用 timezone 获取的时间 (已知的时间)(带时区的时间),django 会自己转换,无需我们手动转换。作用三:模板显示问题:django 模板,会将数据库中 0 时区的时间转换成当地时间,无需我们自己转换。总结:1:django 中推荐使用 USE_TZ = True,让数据库存储 0 时区时间。2:django 后端使用 timezone 获取当地时间,不使用原生的 datetime。3:django 模板无需考虑时区问题,django 将自动转换。4:USE_TZ = True,和 TIME_ZONE = 'Asia/Shanghai' # 亚洲上海必须设置。(搜索结果收录于 2025 年 12 月 31 日)

django:DateTimeField 如何自动设置为当前时间并且能被修改 ——django 日期时间字段的使用

创建 django 的 model 时,有 DateTimeField、DateField 和 TimeField 三种类型可以用来创建日期字段,其值分别对应着 datetime()、date()、time() 三中对象。这三个 field 有着相同的参数 auto_now 和 auto_now_add,表面上看起来很 easy,但实际使用中很容易出错,下面是一些注意点。DateTimeField.auto_now 这个参数的默认值为 false,设置为 true 时,能够在保存该字段时,将其值设置为当前时间,并且每次修改 model,都会自动更新。因此这个参数在需要存储“最后修改时间”的场景下,十分方便。需要注意的是,设置该参数为 true 时,并不简单地意味着字段的默认值为当前时间,而是指字段会被“强制”更新到当前时间,你无法程序中手动为字段赋值;如果使用 django 再带的 admin 管理器,那么该字段在 admin 中是只读的。DateTimeField.auto_now_add 这个参数的默认值也为 False,设置为 True 时,会在 model 对象第一次被创建时,将字段的值设置为创建时的时间,以后修改对象时,字段的值不会再更新。该属性通常被用在存储“创建时间”的场景下。与 auto_now 类似,auto_now_add 也具有强制性,一旦被设置为 True,就无法在程序中手动为字段赋值,在 admin 中字段也会成为只读的。admin 中的日期时间字段 auto_now 和 auto_now_add 被设置为 True 后,这样做会导致字段成为 editable=False 和 blank=True 的状态。editable=False 将导致字段不会被呈现在 admin 中,blank=Ture 表示允许在表单中不输入值。此时,如果在 admin 的 fields 或 fieldset 中强行加入该日期时间字段,那么程序会报错,admin 无法打开;如果在 admin 中修改对象时,想要看到日期和时间,可以将日期时间字段添加到 admin 类的 readonly_fields 中:代码语言:javascript AI 代码解释 classYourAdmin(admin.ModelAdmin):readonly_fields=('save_date','mod_date',)admin.site.register(Tag,YourAdmin) 如何将创建时间设置为“默认当前”并且可修改 那么问题来了。实际场景中,往往既希望在对象的创建时间默认被设置为当前值,又希望能在日后修改它。怎么实现这种需求呢?django 中所有的 model 字段都拥有一个 default 参数,用来给字段设置默认值。可以用 default=timezone.now 来替换 auto_now=True 或 auto_now_add=True。timezone.now 对应着 django.utils.timezone.now(),因此需要写成类似下面的形式:代码语言:javascript AI 代码解释 from django.dbimportmodelsimportdjango.utils.timezoneastimezoneclassDoc(models.Model):add_date=models.DateTimeField('保存日期',default=timezone(2024 年 10 月 24 日)

FAQ

Q1: Django 中 USE_TZ 设置为 True 有什么好处?

Django数据库时间操作怎么用?时间数据怎么存储和处理?

A1: 开启后数据库统一存储 UTC 时间,避免夏令时和多时区导致的时间混乱,模板会自动转换为用户本地时间。

Q2: 如何获取当前时间存入数据库?

A2: 应使用 django.utils.timezone.now() 而不是 datetime.now(),以确保生成带时区信息的时间对象。

Q3: auto_now 和 auto_now_add 有什么区别?

A3: auto_now 在每次保存时更新为当前时间,适合修改时间;auto_now_add 仅在创建时设置,适合创建时间。