当前位置: 首页 > news >正文

Django时区感知

项目配置

settings.py

# 时区设置为中国上海
TIME_ZONE = 'Asia/Shanghai'# 开启时区感知功能
USE_TZ = True

获取当前时间

执行代码:

from django.utils import timezone
from datetime import datetimedate_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 None

django_time: <class 'datetime.datetime'> 2025-09-11 02:28:50.410969+00:00 UTC

local_time: <class 'datetime.datetime'> 2025-09-11 10:28:50.410969+08: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 pytzdate_str = "2025-09-10 10:00:00"
# 将字符串格式的时间转换为datetime类型
date_time = datetime.strptime(date_str, "%Y-%m-%d %H:%M:%S")
# 获取当前时区
tz = timezone.get_current_timezone()
# 将时间标记为utc时区
utc_time = timezone.make_aware(date_time, timezone=timezone.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/Shanghai
date_time: <class 'datetime.datetime'> 2025-09-10 10:00:00 None
utc_time: <class 'datetime.datetime'> 2025-09-10 10:00:00+00:00 UTC
中国上海时间: <class 'datetime.datetime'> 2025-09-10 18:00:00+08:00 Asia/Shanghai
日本东京时间: <class 'datetime.datetime'> 2025-09-10 19:00:00+09: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_length=255)update_time = models.DateTimeField()class Meta:db_table = "user"

执行代码:

from django.utils import timezone
from datetime import datetime
import pytzdate_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, timezone=timezone.utc)
sh_time = timezone.localtime(utc_time, tz)
at_time = timezone.localtime(utc_time, pytz.timezone('Asia/Tokyo'))user_1 = User.objects.filter(update_time=date_str)
user_2 = User.objects.filter(update_time=date_time)
user_3 = User.objects.filter(update_time=utc_time)
user_4 = User.objects.filter(update_time=sh_time)
user_5 = User.objects.filter(update_time=at_time)
print(user_1.query, "   date_str:", date_str)   # 输出sql,实际 where update_time=2025-09-10 02:00:00
print(user_2.query, "   date_time:", date_time)   # 输出sql,实际 where update_time=2025-09-10 02:00:00
print(user_3.query, "   utc_time:", utc_time)   # 输出sql,实际 where update_time=2025-09-10 10:00:00
print(user_4.query, "   sh_time:", sh_time)   # 输出sql,实际 where update_time=2025-09-10 10:00:00
print(user_5.query, "   at_time:", at_time)   # 输出sql,实际 where update_time=2025-09-10 10:00:00

输出结果(观察sql中的where条件值和变量值):

SELECT `user`.`id`, `user`.`name`, `user`.`update_time` FROM `user` WHERE `user`.`update_time` = 2025-09-10 02:00:00    date_str: 2025-09-10 10:00:00
SELECT `user`.`id`, `user`.`name`, `user`.`update_time` FROM `user` WHERE `user`.`update_time` = 2025-09-10 02:00:00    date_time: 2025-09-10 10:00:00
SELECT `user`.`id`, `user`.`name`, `user`.`update_time` FROM `user` WHERE `user`.`update_time` = 2025-09-10 10:00:00    utc_time: 2025-09-10 10:00:00+00:00
SELECT `user`.`id`, `user`.`name`, `user`.`update_time` FROM `user` WHERE `user`.`update_time` = 2025-09-10 10:00:00    sh_time: 2025-09-10 18:00:00+08:00
SELECT `user`.`id`, `user`.`name`, `user`.`update_time` FROM `user` WHERE `user`.`update_time` = 2025-09-10 10:00:00    at_time: 2025-09-10 19:00:00+09:00

总结:当开启了时区感知,使用DjangoORM操作数据库时会自动将时间转换为UTC时区,对于没有时区信息的时间,会将其视为settings.py中所配置的TIME_ZONE时区,因此推荐使用timezone.localtime()来获取当前时间


文章转载自:

http://Xv8U1SAZ.npfrj.cn
http://fWRUTJIO.npfrj.cn
http://eOYod2r5.npfrj.cn
http://2GrpN6oO.npfrj.cn
http://08bMMMmm.npfrj.cn
http://mnybP5hh.npfrj.cn
http://JqTKiZSp.npfrj.cn
http://nYAheZH5.npfrj.cn
http://ldIZp64N.npfrj.cn
http://BXGmENQu.npfrj.cn
http://cYQNNs8r.npfrj.cn
http://CaAxvAhX.npfrj.cn
http://oWsgZn9T.npfrj.cn
http://Y8nVPrzc.npfrj.cn
http://VIqEOdWY.npfrj.cn
http://EP2OmFy7.npfrj.cn
http://5552OOX5.npfrj.cn
http://gsvmzPlQ.npfrj.cn
http://Pra6UdDz.npfrj.cn
http://oE84Yz1q.npfrj.cn
http://doSlDpQD.npfrj.cn
http://FeTt102a.npfrj.cn
http://z04g8CA9.npfrj.cn
http://igZLFY4m.npfrj.cn
http://vRCvTkEC.npfrj.cn
http://qgHXJ7Xb.npfrj.cn
http://vJrx5Rw7.npfrj.cn
http://f4lgdw7y.npfrj.cn
http://WtKbri5Z.npfrj.cn
http://PWlWFbs9.npfrj.cn
http://www.dtcms.com/a/377493.html

相关文章:

  • PostgreSQL15——Java访问PostgreSQL
  • Shell 函数详解
  • 【系统分析师】第21章-论文:系统分析师论文写作要点(核心总结)
  • Linux 命令(top/ps/netstat/vmstat/grep/sed/awk)及服务管理(systemd)
  • 【图像生成】提示词技巧
  • 揭秘Linux:开源多任务操作系统的强大基因
  • (ICLR-2025)深度压缩自动编码器用于高效高分辨率扩散模型
  • 《Why Language Models Hallucinate》论文解读
  • 【机器学习】通过tensorflow实现猫狗识别的深度学习进阶之路
  • AD5362BSTZ电子元器件 ADI 高精度数字模拟转换器DAC 集成电路IC
  • DMA-M2M存储器与存储器之间读写
  • Mistral Document AI已正式登陆Azure AI Foundry(国际版)
  • 机器学习实战(二):Pandas 特征工程与模型协同进阶
  • Flutter 朦胧效果布局大全:5种方法实现优雅视觉层次
  • 【CVPR2023】奔跑而非行走:追求更高FLOPS以实现更快神经网络
  • PHP学习(第三天)
  • 数仓简要笔记-1
  • 机器人商业化落地需要突破的关键性技术
  • AI 技术体系核心概念
  • STM32H750 I2C介绍及应用
  • 计算机网络---物理层
  • 【freemarker】创建html页面
  • 【华为OD】区块链文件转储系统
  • sprintf不是像printf一样的打印函数吗
  • Js 图片加载完成 与 图片缓存加载的区别
  • 汽车动力电池管理系统(BMS):电动汽车的“智能大脑”
  • n8n add npm module 發生 Module ‘ioredis‘ is disallowed,getaddrinfo EAI_AGAIN
  • 性能——day3
  • 安卓学习 之 SeekBar(音视频播放进度条)
  • CRMEB标准版PHP订单列表功能详解与优化技巧