Django时区感知

发布时间:2026/11/4 11:20:41

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}
延伸阅读

更多相关文章

2026/11/4 11:15:40

三月七小助手实用指南:从部署到日常任务自动化

三月七小助手实用指南:从部署到日常任务自动化 【免费下载链接】March7thAssistant 日常交给三月七,开拓留给你。《崩坏:星穹铁道》开源自动化助手。 项目地址: https://gitcode.com/gh_mirrors/ma/March7thAssistant 每天打开游戏&am…

2026/11/4 11:15:40

不装客户端,9 大网盘直链下载全支持:LinkSwift 实用指南

不装客户端,9 大网盘直链下载全支持:LinkSwift 实用指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘 / 迅…

2026/11/4 12:15:56

MySQL学习(2)数据库创建与备份实战指南

🔥keyipatience:个人主页 🎬作者简介:C/C后端开发学习者 🌟专栏传送门:《c》《linux》《c高阶数据结构》《c数据结构与算法》《前端学习》 《Git》《Mysql》 ⭐️patience is key in life 创建数据库 create database…

2026/11/4 12:15:56

ffmpeg HLS 分片‑copyts 参数时间戳拷贝带来的各类隐形故障

一、‑copyts 参数业务背景 很多同学在做直播转码、录播切片的时候,会接触 ffmpeg 的‑copyts参数。该参数作用是保留原始输入流的 PTS/DTS 时间戳,不重置时间戳。 很多网上示例,做直播录制直接加上‑copyts。但是新手不理解该参数副作用&a…

2026/11/4 12:15:56

逻辑严谨吗?8款AI写作辅助网站综合榜,毕业论文轻松搞定!

写论文时是不是总卡在开头,脑袋空白无从下笔?文献看不完,却始终理不清逻辑主线?反复修改格式,查重率还是居高不下? 别担心,现在有AI论文写作工具帮你一键破局。本文深度实测8款热门AI论文辅助平…

2026/11/4 12:15:56

HashMap 底层实现:数组容量为什么必须是 2 的幂

先给结论 因为要用 & (n-1) 代替取模。n 是 2 的幂时,n-1 的二进制全是 1,位与的结果刚好等价于取模,而且比取模快。 但更值钱的理由在扩容那一步,多数人不知道。 一个很常见的初始化 很多团队写代码时都会这么干:…

2026/11/4 12:10:55

网络安全实战第19期:三重防护失效真相之注入攻击的无限变形之路

转义、黑名单、前端校验:为什么这三样都挡不住注入 网络安全实战 90 天 Week 3 注入风险 | 难度 ★★★ 进阶 | 关键词:输入转义 黑名单缺陷 前端校验 纵深防御 类型约束前面几篇的验证在低防护级别下全部成立。把防护级别调高再试,…

2026/11/3 7:47:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/3 14:24:53

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/4 0:03:20

AI辅助技术栈评估:提升研发决策效率60%

1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年…

2026/11/4 0:03:20

从生成Token到直接决策:Jev如何重塑AI Agent工程实践

1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你…

2026/11/4 0:03:20

32G统一内存跑大模型:内存账、TPS实测与端云分流

想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统…

2026/11/3 7:47:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/3 14:24:53

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑