一篇文章解决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, 我尝试过在模板页面用类似如下的方式 程序代码 { ...
随机推荐
- 课时15.DTD文档声明下(了解)
W3C的官方网站是W3School,我们可以去官方网站查询DTD文档声明. HTML4.01 Strict 非常严谨的 如果你写了这个DTD文档声明,你就不能写如下样式: <fon ...
- JavaScript 笔记总结
一.js的简介 1.js是什么 js是可以嵌入到html中,是 基于对象 和 事件驱动 的 脚本语言 特点: (1)交互性 (2)安全性:js不能访问本地磁盘 (3)跨平台:浏览器中都具备js解析器 ...
- 菜鸟笔记 -- Chapter 6.2.2 标识符
6.2.2 标识符 Java中使用标识符来作为类.方法.字段的名称,在Java基础中我们已经简单了解过标识符的定义方法和驼峰命名.本节我们来研究一下标识符的长度问题,难道类名.方法名都可以无限长吗? ...
- 关于 NSData 的数据类型(2进制,16进制之间)及深入剖析(转)
. NSData 与 NSString NSData-> NSString NSString *aString = [[NSString alloc initWithData:adataenco ...
- 怎样在Swift中使用CocoaPods
怎样在Swift中使用CocoaPods 它不是神秘的亚马逊区域的部落人用手捡出来的生可可的豆荚,肯定不是!让CocoaPods website来回答可能是最好的: CocoaPods是Cocoa项目 ...
- vue.js中的slot
vue.js 中的 slot 一.slot 的作用 调用组件的时候,对于数据,我们会用props将数据从父组件传至子组件.但是,如果从父组件到子组件,单纯是页面局部渲染的改变,slot会更合适. 二. ...
- dropload上拉加载更多
<link href="~/Scripts/dropload/dropload.min.css" rel="stylesheet" /> <s ...
- 第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛--K-密码
链接:https://www.nowcoder.com/acm/contest/90/K 来源:牛客网 - 1.题目描述 ZiZi登录各种账号的时候,总是会忘记密码,所以他把密码都记录在一个记事本上. ...
- ethereum Pet Shop
在部署宠物商店时遇到的一些坑,给大家总结一下,以免大家多走弯路 转载的地址(详细):https://steemit.com/cn/@lucia3/ethereum-pet-shop 启动"n ...
- dedecms左侧导航栏不显示问题
dedecms左侧导航栏不显示问题 在做织梦项目时,经常会碰到后台左侧导航栏不显示的问题,如下所示: 这主要是由于文件权限不足造成的.有两种方法 第一种:把 /data 文件夹全部改成 777 权 ...