Django时区感知

发布时间:2026/11/4 11:21:24
Django时区感知 本案例使用 python3.8 django3.2.18项目配置settings.py# 时区设置为中国上海 TIME_ZONE Asia/Shanghai # 开启时区感知功能 USE_TZ True获取当前时间执行代码from django.utils import timezone from datetime import datetime date_time datetime.now() zone_time timezone.now() local_time timezone.localtime() print(date_time, type(date_time), date_time, date_time.tzinfo) print(django_time, type(zone_time), zone_time, zone_time.tzinfo) print(local_time, type(local_time), local_time, local_time.tzinfo)执行结果date_time class datetime.datetime 2025-09-11 10:28:50.410969 Nonedjango_time class datetime.datetime 2025-09-11 02:28:50.41096900:00 UTClocal_time class datetime.datetime 2025-09-11 10:28:50.41096908:00 Asia/Shanghai三者数据类型均为datetime.datetime主要区别在于时间和时区源码解析datetime.now()python自带的包一般都用这个获取当前时间不带时区信息没啥好说的。timezone.now()django的包用于获取当前时间并且携带时区信息如果开启了时区感知则获取的是UTC时区的时间否则效果和datetime.now()相同源码timezone.localtime()django的包默认用于获取当前时间并将其转换为TIME_ZONE所配置的时区此外这个函数还可以将指定的时间转换为指定的时区但是要注意传递的时间必须是携带时区信息否则就会抛出179行的异常localtime() cannot be applied to a naive datetime表示这个时间没有时区信息无法转换到目标时区源码时区转换from django.utils import timezone from datetime import datetime import pytz date_str 2025-09-10 10:00:00 # 将字符串格式的时间转换为datetime类型 date_time datetime.strptime(date_str, %Y-%m-%d %H:%M:%S) # 获取当前时区settings.TIME_ZONE tz timezone.get_current_timezone() # 将时间标记为utc时区timezone默认为当前时区也可以使用pytz.timezone()指定时区 utc_time timezone.make_aware(date_time, timezonetimezone.utc) # 转换为指定时区的时间 sh_time timezone.localtime(utc_time, tz) at_time timezone.localtime(utc_time, pytz.timezone(Asia/Tokyo)) print(tz, type(tz), tz) print(date_time, type(date_time), date_time, date_time.tzinfo) print(utc_time, type(utc_time), utc_time, utc_time.tzinfo) print(中国上海时间, type(sh_time), sh_time, sh_time.tzinfo) print(日本东京时间, type(at_time), at_time, at_time.tzinfo)输出结果tz class pytz.tzfile.Asia/Shanghai Asia/Shanghaidate_time class datetime.datetime 2025-09-10 10:00:00 Noneutc_time class datetime.datetime 2025-09-10 10:00:0000:00 UTC中国上海时间 class datetime.datetime 2025-09-10 18:00:0008:00 Asia/Shanghai日本东京时间 class datetime.datetime 2025-09-10 19:00:0009:00 Asia/Tokyo时区感知对数据库操作的影响创建数据库表CREATE TABLE user ( id int NOT NULL AUTO_INCREMENT, name varchar(255) NULL, update_time datetime NULL, PRIMARY KEY (id) );DajngoModel层class User(models.Model): name models.CharField(max_length255) update_time models.DateTimeField() class Meta: db_table user执行代码from django.utils import timezone from datetime import datetime import pytz date_str 2025-09-10 10:00:00 date_time datetime.strptime(date_str, %Y-%m-%d %H:%M:%S) tz timezone.get_current_timezone() utc_time timezone.make_aware(date_time, timezonetimezone.utc) sh_time timezone.localtime(utc_time, tz) at_time timezone.localtime(utc_time, pytz.timezone(Asia/Tokyo)) user_1 User.objects.filter(update_timedate_str) user_2 User.objects.filter(update_timedate_time) user_3 User.objects.filter(update_timeutc_time) user_4 User.objects.filter(update_timesh_time) user_5 User.objects.filter(update_timeat_time) print(fdate_str: {date_str}\n{user_1.query}) # 输出sql实际 where update_time2025-09-10 02:00:00 print(fdate_time: {date_time}\n{user_2.query}) # 输出sql实际 where update_time2025-09-10 02:00:00 print(futc_time: {utc_time}\n{user_3.query}) # 输出sql实际 where update_time2025-09-10 10:00:00 print(fsh_time: {sh_time}\n{user_4.query}) # 输出sql实际 where update_time2025-09-10 10:00:00 print(fat_time: {at_time}\n{user_5.query}) # 输出sql实际 where update_time2025-09-10 10:00:00输出结果观察时间变量和sql中的update_time条件值date_str: 2025-09-10 10:00:00SELECT user.id, user.name, user.update_time FROM user WHERE user.update_time 2025-09-10 02:00:00date_time: 2025-09-10 10:00:00SELECT user.id, user.name, user.update_time FROM user WHERE user.update_time 2025-09-10 02:00:00utc_time: 2025-09-10 10:00:0000:00SELECT user.id, user.name, user.update_time FROM user WHERE user.update_time 2025-09-10 10:00:00sh_time: 2025-09-10 18:00:0008:00SELECT user.id, user.name, user.update_time FROM user WHERE user.update_time 2025-09-10 10:00:00at_time: 2025-09-10 19:00:0009:00SELECT user.id, user.name, user.update_time FROM user WHERE user.update_time 2025-09-10 10:00:00总结当开启了时区感知使用DjangoORM操作数据库时会自动将时间转换为UTC时区对于没有时区信息的时间会将其视为settings.py中所配置的TIME_ZONE时区因此推荐使用timezone.localtime()来获取当前时间API接口返回指定格式时间假设现在有一个API接口要返回时间相关的数据from django.utils import timezone from django.http import JsonResponse def getTime(request): data { message: 成功获取当前时间, localtime: timezone.localtime() } return JsonResponse(data)API接口返回结果{message: 成功获取当前时间,localtime: 2025-09-13T14:22:45.67508:00}所返回的时间可能并非我们期望的格式此时可以使用自定义json编码器对数据进行格式化CustomizeEncoder.pyimport json from datetime import datetime from decimal import Decimal from django.utils import timezone # 自定义json编码器将指定类型的数据进行格式化 class CustomizeEncoder(json.JSONEncoder): def default(self, o): if isinstance(o, datetime): if o.tzinfo: return timezone.localtime(o).strftime(%Y-%m-%d %H:%M:%S) else: return o.strftime(%Y-%m-%d %H:%M:%S) elif isinstance(o, Decimal): return float(o) # 使用默认的编码 return json.JSONEncoder.default(self, o)修改后的代码from django.utils import timezone from django.http import JsonResponse from XX.XX.CustomizeEncoder import CustomizeEncoder def getTime(request): data { message: 成功获取当前时间, localtime: timezone.localtime() } return JsonResponse(data, encoderCustomizeEncoder)再次请求API接口返回结果{message: 成功获取当前时间,localtime: 2025-09-13 14:40:59}

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询