django时区和postgres时区

1. 背景

公司有个任务,功能要求:限制用户24小时发送的任务数,同时要告诉用户什么时间可以重试。

但是............,发现几个问题:

  • django代码打印出来的timezone.now(),跟北京时间差8个小时
  • django的日志打印,最前边的部分,是跟北京时间一样的
  • postgres时区,跟北京时间差8个小时
python 复制代码
# 查看django的timezone的当前时间,时区
from django.utils import timezone
print(timezone.now())
# 输出 datetime.datetime(2024, 4, 30, 8, 45, 27, 427727, tzinfo=<UTC>)



# 查看系统的当前时间和时区,一般跟服务器一样
from datetime import datetime
from django.utils import timezone
print(datetime.now()) # 结果跟北京时间一样
timezone.make_aware(datetime.now())
# 输出 datetime.datetime(2024, 4, 30, 16, 47, 51, 43601, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>)


# 查看postgres的时区
show timezone # 结果是ETC/UTC
select now() # 结果的时间,跟北京时间差8个小时

从结果来看,django的timezone=postgres的时区,但是和datetime.now()是不一样的。什么原因呢?先看原理

2. 需要明白的知识

django的timezone是根据settings的配置来显示的,需要两个参数来控制

python 复制代码
from django.utils import timezone
# 输出时区
print(timezone.get_current_timezone_name())
# 'Asia/Shanghai'
print(settings.USE_TZ) # True

datetime的时间是同步于系统的,而且django的日志模块Logging,就是跟datetime的时间是一样的。

postgres的时区是在postgres.conf里配置的,这个自己GPT

3. 最后解决方法

  1. django的timezone和数据库的timezone必须是一致的
  2. 在展示给用户重试的时间,在数据库中查找24小时内的比对任务数,然后取最早的时间,使用timezone.localtime(create_time)进行转换。
python 复制代码
timezone.localtime(create_time)

然后就解决了。

4. 最后

解决问题先救急后优化。一定不能慌,慢慢来,纠细节,别老用加8小时-24小时,这种太不确定了。思路捋不顺,多跟小鸭子讲讲。欢迎大家评论指正

相关推荐
程序员miki4 分钟前
训练yolo11检测模型经验流程
python·yolo
夏了茶糜17 分钟前
Python中生成器表达式(generator expression)和列表推导式(list comprehension)的区别
python·列表推导式·生成器表达式
上天夭23 分钟前
补充提问(四)
windows·python
DBA小马哥23 分钟前
InfluxDB迁移?时序数据库国产替代三大难点与实践
数据库·时序数据库
LYOBOYI12325 分钟前
qml程序运行逻辑
java·服务器·数据库
0xwang29 分钟前
【python01】搭建环境
python
袁煦丞 cpolar内网穿透实验室36 分钟前
mysql_exporter+cpolar远程监控 MySQL 不卡壳!cpolar 内网穿透实验室第 712 个成功挑战
服务器·数据库·mysql·远程工作·内网穿透·cpolar
Mikhail_G39 分钟前
Mysql数据库操作指南(零基础篇二)
大数据·数据库·sql·mysql·数据分析
一条大祥脚41 分钟前
26.1.24 分块|排序|中位数贪心+线段树二分+聚集贪心
数据库·redis·缓存
人工智能AI技术42 分钟前
【Agent从入门到实践】31 工具调用的核心逻辑:Agent如何选择并执行工具
人工智能·python