Django 中的时间处理
操作系统为OS X 10.9.2,Django为1.6.5.
1.时区
在setting.py文件中设置了时区
TIME_ZONE = 'Asia/Shanghai' # 设置时区为UTC+8 USE_TZ = True
Django的admin页面中显示的日期为北京时间(UTC-8):
在MySQL数据库中存储的时间为:
时间不一致的原因时:在setting.py文件中进行时区设置后,Django内部会自动把时间当成北京时间(UTC-8)对待,但MySQL数据库中还是存储为标准时区时间。
要实现的目标:查询某天的条目。
代码:
from datetime import date, timedelta
today = date.today() # 今天的日期 d = today d2 = today+timedelta(days=1) temp['articles'] = Article.objects.filter(timestamp__range=(d,d2))
出现报错:/Library/Python/2.7/site-packages/Django-1.6.5-py2.7.egg/django/db/models/fields/__init__.py:848: RuntimeWarning: DateTimeField Article.timestamp received a naive datetime (2014-08-04 00:00:00) while time zone support is active.(RuntimeWarning)
修改后的代码:
from django.db.models import Min from datetime import timedelta from django.utils import timezone firstday = Article.objects.aggregate(Min('timestamp'))['timestamp__min'] d1 = firstday.replace(day=1,hour=0,minute=0,second=0,microsecond=0) now = timezone.now() # 今天的日期
# 查询从本月1号到今天的条目 while(d1<now): d2 = d1 + timedelta(days=1) a = Article.objects.filter(timestamp__range=(d1,d2)) d1 = d2
各种时间方法获得的时间格式不同:
>>> a.timestamp # 数据库中存储的包含时区的标准时区时间 datetime.datetime(2014, 8, 7, 5, 21, 16, tzinfo=<UTC>) >>> >>> from datetime import date >>> today = date.today() >>> today datetime.date(2014, 8, 7) # 没有包含时区信息 >>> >>> from datetime import datetime >>> now = datetime.now() >>> now datetime.datetime(2014, 8, 7, 13, 51, 20, 925928) # 没有包含时区信息,是北京时间 >>> >>> from django.utils import timezone >>> now = timezone.now() >>> now datetime.datetime(2014, 8, 7, 5, 53, 29, 798424, tzinfo=<UTC>) #包含时区信息的标准时间
>>>
>>> timezone.localtime(now)
datetime.datetime(2014, 8, 7, 13, 53, 29, 798424, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>) #将标准时间转换为北京时间
参考资料:
http://blog.xsudo.com/archives/1224.html
http://bbs.csdn.net/topics/390517579
http://blog.feshine.net/technology/1220.html