zoukankan      html  css  js  c++  java
  • 一篇文章解决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参数

  • 相关阅读:
    项目中openlayer中使用,完整解决方案(数据库矢量数据,动态更新,分层,编辑)
    openlayer
    关于splitViewController自己的总结....
    GIS底层开发总结
    判断联网 phone
    nsdate 前一天 后一天
    ObjectiveC 字符处理函数 全 substring indexof
    oracle
    Windows Xp上跑IIS5.1x 用户访问过多出错
    Jquery中替换节点的方法replaceWith()和replaceAll()
  • 原文地址:https://www.cnblogs.com/limaomao/p/9257014.html
Copyright © 2011-2022 走看看