一篇文章解决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时间:python

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()

 

一、navie时间和aware时间?
  navie时间:不知道本身是哪一个时区的幼稚时间
  aware时间:清醒的知道本身是哪一个时区的时间数据库

二、pytz库?
  在python中用来处理时区时间的库,下面简介这个库里面的几个方法:django

  tz = pytz.timezone('时区'):定义一个时区信息,例如定义一个中国时区就可使用:
  c_tz = pytz.timezone('Asia/Shanghai')cookie

三、replace方法:
  能够替代时间元祖中各个元素的方法,固然也能够用来指定当前时间的时区信息:
  from datetime import datetime
  now = datetime.now() # datetime中的时间是一个navie时间
  asia_now = now.replace(tzinfo=pytz.timezone('Asia/Shanghai')) # 时间被转换成aware时间spa

四、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时区时间源码

五、在Django中使用aware时间:
  首先,在setting.py文件中设置:
  USE_TZ=Trueit

  使用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()ast

  此时,从now的定义中你就能够知道只要在setting.py文件中设置了USE_TZ=True,此时的now就是一个aware时间import

注:若是你在django项目中使用USE_TZ=True,那么你在项目中设置时间的时候就要注意了,一帮都会使用django.utils.timezone.make_aware先设置时间为aware时间,而后再去进行设置查询等操做(如设置cookie过时时间的expires参数date

相关文章
相关标签/搜索