django时区相关说明

# naive time
从字面意思上理解,这是个"幼稚的时间",所以可以理解为它是个本地时间,不带时区信息,不能直接用于存储,如下
import datetime
datetime.datetime.now()   # 本地时间,不带时区
datetime.datetime.utcnow() # utc时间,不带时区
"""不带时区的naive time
2022-02-09 11:20:22.074294
2022-02-09 03:27:57.935250
"""

# active time
从字面意思上理解,这是个"清醒的时间",所以可以理解为带时区的时间,那么这个"active time"就是我们需要的datetime类型,只要给他正确的时区,存进数据库,那么你的网站的时间就永远不会有问题了,服务器日志也不会再有让你内心奔溃的东西出现了。
对于每一个"naive time"我们只需要给它一个正确的tzinfo它就可以被正常使用了,那么这个tzinfo从哪里来呢?在安装django的时候它会检测你有没有安装pytz这个库,如果没有它会自动帮你装上。
简单点说就是一个python的时区管理包,那么以后只要我们每次涉及到时间操作时都这样写
from pytz import timezone
import datetime
my_zone = timezone("Asia/Shanghai")
my_time = datetime.datetime.now().replace(tzinfo=my_zone)

# 如在django项目中,推荐使用下面的,底层也是pytz实现的
from django.utils import timezone

# django项目中有相关时间问题的话推荐使用
form django.utils import timezone
timezone.now()  # 带时区的


# 如何读取datetime并正确显示
## 当存进的datetime时间和它的时区与你所在的时间不对应时的解决办法
1.datetime.astimezone()
2.django.utils.timezone.localtime()
以上两种方法都可以将一个时间转换为另一个时区时间,而2中默认转换为django setting里的时区,当然你也可以指定时区转换。
import datetime
from pytz import timezone
utc_zone = timezone("utc")
my_zone = timezone("Asia/Shanghai")
my_time = datetime.datetime.utcnow().replace(tzinfo=utc_zone)
out_time = my_time.astimezone(my_zone)
print(out_time.strftime("%Y-%m-%d %H:%M:%S"))

# 一些django中timezone的方法
timezone.localtime()  # 将一个其它时区的"active time"转换为本地时间,当然这个本地时间依然是有时区的,不是"naive"的,你也可以指定一个timezone让localtime将"active time"转换为其它时区的time
timezone.now() # 可以根据setting中USE_TZ返回一个有(无)时区的datetime.
timezone.is_aware()  # 判断一个datetime是否是"active"
timezone.is_naive() # 判断一个datetime是否是"naive"
timezone.make_aware()  # 将naive time转换为active time
timezone.make_naive() # 将active time 转换为naive time
https://blog.csdn.net/ronon77/article/details/84884106
https://cloud.tencent.com/developer/article/1028182?from=15425
posted @ 2022-01-06 10:44  我在路上回头看  阅读(40)  评论(0编辑  收藏  举报