首先要明确的是,当在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中时区问题的更多相关文章

  1. Java 集合详解 | 一篇文章解决Java 三大集合

    更好阅读体验:Java 集合详解 | 一篇文章搞定Java 三大集合 好看的皮囊像是一个个容器,有趣的灵魂像是容器里的数据.接下来讲解Java集合数据容器. 文章篇幅有点长,还请耐心阅读.如只是为了解 ...

  2. 解决 django 中 mysql gone away 的问题

    最近在项目中,我使用 Django Command 模块写了一个脚本,处理从 MQ 发来的消息,并入库.在测试过程中,程序运行良好,但是在程序上线并运行一段时间后,出现了以下错误: Operation ...

  3. django中时区设置

    通过django中的models更新数据库的DateTimeField字段,发现有错误,于是更改了: TIME_ZONE = 'Asia/Shanghai' 结果,还是不正确,于是把: USE_TZ ...

  4. InfluxDB从原理到实战 - 一篇文章搞懂InfluxDB时区

    0x00 简介    InfluxDB默认以UTC时间存储并返回时间戳,当接收到一个时序数据记录时,InfluxDB将时间戳从本地时区时间转换为UTC时间并存储,查询时,InfluxDB返回的时间戳对 ...

  5. 一篇文章解决MongoDB的所有问题

    目录 一.MongoDB相关概念 1.1 业务应用场景 1.1.1 而MongoDB可应对"三高"需求· 1.1.2 什么时候选择MongoDB? 1.1.3 如果用mysql? ...

  6. 如何解决 Django中出现的 [Errno 13] Permission denied问题

    环境:linux 如果你使用了Apache部署了Django项目,在上传文件时可能会出现 “[Errno 13] Permission denied:某目录”的错误. 这是因为apache没有权限在该 ...

  7. 解决Django中在.js文件中用ajax请求后端,找不到CSRF问题

    function getCookie(name) { var cookieValue = null; if (document.cookie && document.cookie != ...

  8. 在django中怎么解决没有MySQLdb库的问题

    1.安装:pymysql模块 2.在app文件目录下,找到__init__.py文件,在文件中写入下面的代码 #解决django中的MySQLdb模块在python3中没有的问题 import pym ...

  9. Django 中 如何使用 settings.py 中的常量

    在用django 框架开发 python web 程序的时候 , 在模板页面经常会用到 settings.py 中设置的常量,比如MEDIA_URL, 我尝试过在模板页面用类似如下的方式 程序代码 { ...

随机推荐

  1. pdf.js 在线阅读PDF

    在网上找了一下如何在线显示pdf文件.个人还是觉得这个是比较不错的,这里做一个记录. gitHub:https://github.com/mozilla/pdf.js           这是一个开源 ...

  2. golang-Tag

    Tag 理解 Golang中可以对struct定义Tag 例如: type TestTag struct{ UserName string `json:"name"` Age In ...

  3. 名词解释-FrameWork

    直接翻译的意思是架构,但这样说可能不懂,下面我从两个方面来给你说吧: 一是比喻来说,假设你现在要盖楼房,framework就好比一个建筑公司,它里面有专门采集石料的,专门的租夹板的,专门的磨砂,搬砖的 ...

  4. 2018/7/19 考试(tower,work,holes)

    noip模拟赛,挺良心的题,考的贼烂(膜一下@来日方长大佬(sdfz rank1)) 不多说了,看题吧 1.tower 题面: 铁塔(tower.pas/c/cpp) 题目描述 Rainbow和Fre ...

  5. ATX 浅谈自动化测试工具 python-uiautomator2

    1.简介 python-uiautomator2是一个自动化测试开源工具,仅支持Android平台的原生应用测试. 2.支持平台及语言 python-uiautomator2封装了谷歌自带的uiaut ...

  6. 根据坐标计算距离(mysql函数)

    CREATE DEFINER=`root`@`localhost` FUNCTION `getDistance`(lng1 ) BEGIN DECLARE result double; DECLARE ...

  7. 精干货! Java 后端程序员 1 年工作经验总结

    一.引言   毕业已经一年有余,这一年里特别感谢技术管理人员的器重,以及同事的帮忙,学到了不少 东西.这一年里走过一些弯路,也碰到一些难题,也受到过做为一名开发却经常为系统维护 和发布当救火队员的苦恼 ...

  8. 使用jQuery实现数字逆时针旋转

    要实现数字逆转,最主要是分析我们页面的元素结果,结合选择器充分利用起来! 例如:以下lable中每一个id和值的安排具有一定结构的意义需要用心分析: jQuery代码:

  9. json_decode结果为null的几种原因

    值只能是UTF-8编码,元素最后不能有逗号,元素不能使用单引号,元素值中间不能有空格和n.

  10. Python的scrapy学习心得

    scrapy框架是Python爬虫的一个使用起来不错的框架,通过这个框架可以很快的爬出自己想要的数据 官方的定义是如下的图片,其实看不太懂 在平常使用这个框架的时候,主要用三部分,spider爬虫主体 ...