一篇文章解决django中时区问题
首先要明确的是,当在Django项目的setting.py文件中设置了USE_TZ=True时,我们给定的时间存储到数据库的时候都会变成UTC时间(使用auto_now_add和auto_now为True的情况会直接使用时间戳转换成UTC时间保存到数据库,而手动添加的datetime.datetime类型的时间会根据setting.py文件中设置的TIME_ZONE字段表示的时区转换成对应的UTC时区时间,然后保存到数据库中),此时这个时间也是一个aware时间,当我们使用时间作为查询条件进行数据过滤的时候,django会根据setting.py中设置的TIME_ZONE的时区信息去转换这个时间到UTC时间(如果你的查询时间条件为navie时间,那么django会给出警告,但是还是会尝试把你给出的时间的时区信息转换成setting.py文件中TIME_ZONE所标识的时区,然后在转换成UTC时间作为条件在数据库中进行查询,当然如果你给定的时间是一个aware时间,就不会给警告,直接转换成UTC时间对数据库进行查询),然后再去数据库筛选。如果想要把本地时间保存到数据库中,需要设置USE_TZ=False,但是此时的时间就是navie时间:
def now():
"""
Return an aware or naive datetime.datetime, depending on settings.USE_TZ.
"""
if settings.USE_TZ:
# timeit shows that datetime.now(tz=utc) is 24% slower
return datetime.utcnow().replace(tzinfo=utc) # 内部使用time.time()实现,与其他设置无关
else:
return datetime.now()
1、navie时间和aware时间?
navie时间:不知道自己是哪个时区的幼稚时间
aware时间:清醒的知道自己是哪个时区的时间
2、pytz库?
在python中用来处理时区时间的库,下面简介这个库里面的几个方法:
tz = pytz.timezone('时区'):定义一个时区信息,例如定义一个中国时区就可以使用:
c_tz = pytz.timezone('Asia/Shanghai')
3、replace方法:
可以替代时间元祖中各个元素的方法,当然也可以用来指定当前时间的时区信息:
from datetime import datetime
now = datetime.now() # datetime中的时间是一个navie时间
asia_now = now.replace(tzinfo=pytz.timezone('Asia/Shanghai')) # 时间被转换成aware时间
4、astimezone方法:
可以将一个时区的时间转换成另一个时区的时间,前提是这个被转换的时间必须是一个aware时间,使用方式如下:
utc_tz = pytz.timezone('UTC') # 定义一个时区的实例
from datetime import datetime
now = datetime.now() # datetime中的时间是一个navie时间
asia_now = now.replace(tzinfo=pytz.timezone('Asia/Shanghai')) # 时间被转换成aware时间
utc_now = asia_now.astimezone(utc_tz) # 把一个中国时区的时间转换成utc时区时间
5、在Django中使用aware时间:
首先,在setting.py文件中设置:
USE_TZ=True
使用from django.utils.timezone import now中的now作为当前时间,源码如下:
def now():
"""
Return an aware or naive datetime.datetime, depending on settings.USE_TZ.
"""
if settings.USE_TZ:
# timeit shows that datetime.now(tz=utc) is 24% slower
return datetime.utcnow().replace(tzinfo=utc)
else:
return datetime.now()
此时,从now的定义中你就可以知道只要在setting.py文件中设置了USE_TZ=True,此时的now就是一个aware时间
注:如果你在django项目中使用USE_TZ=True,那么你在项目中设置时间的时候就要注意了,一帮都会使用django.utils.timezone.make_aware先设置时间为aware时间,然后再去进行设置查询等操作(如设置cookie过期时间的expires参数
一篇文章解决django中时区问题的更多相关文章
- Java 集合详解 | 一篇文章解决Java 三大集合
更好阅读体验:Java 集合详解 | 一篇文章搞定Java 三大集合 好看的皮囊像是一个个容器,有趣的灵魂像是容器里的数据.接下来讲解Java集合数据容器. 文章篇幅有点长,还请耐心阅读.如只是为了解 ...
- 解决 django 中 mysql gone away 的问题
最近在项目中,我使用 Django Command 模块写了一个脚本,处理从 MQ 发来的消息,并入库.在测试过程中,程序运行良好,但是在程序上线并运行一段时间后,出现了以下错误: Operation ...
- django中时区设置
通过django中的models更新数据库的DateTimeField字段,发现有错误,于是更改了: TIME_ZONE = 'Asia/Shanghai' 结果,还是不正确,于是把: USE_TZ ...
- InfluxDB从原理到实战 - 一篇文章搞懂InfluxDB时区
0x00 简介 InfluxDB默认以UTC时间存储并返回时间戳,当接收到一个时序数据记录时,InfluxDB将时间戳从本地时区时间转换为UTC时间并存储,查询时,InfluxDB返回的时间戳对 ...
- 一篇文章解决MongoDB的所有问题
目录 一.MongoDB相关概念 1.1 业务应用场景 1.1.1 而MongoDB可应对"三高"需求· 1.1.2 什么时候选择MongoDB? 1.1.3 如果用mysql? ...
- 如何解决 Django中出现的 [Errno 13] Permission denied问题
环境:linux 如果你使用了Apache部署了Django项目,在上传文件时可能会出现 “[Errno 13] Permission denied:某目录”的错误. 这是因为apache没有权限在该 ...
- 解决Django中在.js文件中用ajax请求后端,找不到CSRF问题
function getCookie(name) { var cookieValue = null; if (document.cookie && document.cookie != ...
- 在django中怎么解决没有MySQLdb库的问题
1.安装:pymysql模块 2.在app文件目录下,找到__init__.py文件,在文件中写入下面的代码 #解决django中的MySQLdb模块在python3中没有的问题 import pym ...
- Django 中 如何使用 settings.py 中的常量
在用django 框架开发 python web 程序的时候 , 在模板页面经常会用到 settings.py 中设置的常量,比如MEDIA_URL, 我尝试过在模板页面用类似如下的方式 程序代码 { ...
随机推荐
- 浅谈二分查找 JavaScript
算法介绍 二分查找,也称折半查找,是一种在有序数组中查找特定元素的搜索算法.查找过程经历一下步骤: (1)从有序数组的中间的元素开始搜索,如果该元素正好是目标元素,则停止搜索并返回该元素的索引值,否则 ...
- Java虚拟机垃圾回收(二) :垃圾回收算法(转载)
1.标记-清除算法 标记-清除(Mark-Sweep)算法是一种基础的收集算法. 1.算法思路 "标记-清除"算法,分为两个阶段: (A).标记 首先标记出所有需要回收的对象: 标 ...
- Python常用模块之time和datetime
1.时间的格式化 结构化时间 ##把字符串时间转换成结构化时间 time.strptime("2017-06-21","%Y-%m-%d") ##把结构化时间转 ...
- 从 React 的组件更新谈 Immutable 的应用
在介绍 Immutable 如何在 React 中应用之前,先来谈谈 React 组件是如何更新的. React 是基于状态驱动的开发,可以将一个组件看成是一个有限状态机,组件要更新,必须更新状态. ...
- vsftpd文件服务参数汇总和虚拟用户使用
FTP文件传输协议 FTP协议特点 基于C/S结构 双通道协议:数据和命令连接 数据传输格式:二进制(默认)和文本(w文本格式会修改文件内容) 两种模式:服务器角度 主动(PORT style):服务 ...
- 01 shell编程规范与变量
前言: 大家对shell脚本应该都不算陌生了,如果突然问你什么是shell脚本?是干什么用的?由什么组成以及怎么使用?变量的概念是什么?作用范围是什么?变量间的算术运算怎么表示?你能很容易答出来吗 本 ...
- 在Liunx Mint下无法切换到root用户
提示 su: Authentication failure 以ubuntu的mint root用户默认是也是禁止的 需要手动打开才行 a)root启用 执行下面的操作:1.先解除root锁定,为roo ...
- PHP令人困惑的strtotime
经常会有人被strtotime结合-1 month, +1 month, next month的时候搞得很困惑, 然后就会觉得这个函数有点不那么靠谱, 动不动就出问题. 用的时候就会很慌… 比如:今天 ...
- MySQL 主从服务器配置
在主服务器Ubuntu上进行备份,执行命令: mysqldump -uroot -p --all-databases --lock-all-tables > ~/master_db.sql -u ...
- Python学习之模块基础
模块就是程序 编写以下简单代码 print('hello python') 并将py文件保存在c盘的python(假设新建)文件下,通过pycharm的Terminal 或者windom命令窗口调出p ...