python,django,mongo的时区问题
最近项目中使用django做后台,查询mongo的中数据, 而mongo中的数据是使用python脚本导入的,而查询的时候又是从django中查询的,有需要按时
间查询,导致通过界面中查询的数据跟后面使用脚本查询的数据不一致, 然后跟进去是时区不一直导致的。
首先介绍下,python中的时间是本地的不带时区的时间,django中的时间是带时区的时间,mongo中存的是utc时间,不带时区,如下:
>> import datetime >> datetime.datetime.now() datetime.datetime(2012, 12, 26, 23, 42, 5, 372011) >> from django.utils import timezone >> timezone.now() datetime.datetime(2012, 12, 27, 5, 42, 48, 979966, tzinfo=<UTC>)
当然你也可以在python使用pytz模块来设置时区, 设置方式如下:
>> tz = pytz.timezone("Asia/Shanghai") >> datetime.datetime.now(tz) datetime.datetime(2012, 12, 27, 13, 43, 36, 852530, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>)
然后将以上三条数据通过pymongo插入到mongo中,在mongo的命令行中的到如下结果:
{ "_id" : ObjectId("50dbe047d8c2e317e49619f5"), "cur_time" : ISODate("2012-12-26T23:42:05.372Z") } { "_id" : ObjectId("50dbe054d8c2e317e49619f6"), "cur_time" : ISODate("2012-12-27T05:42:48.979Z") } { "_id" : ObjectId("50dbe061d8c2e317e49619f7"), "cur_time" : ISODate("2012-12-27T05:43:36.852Z") }
从以上的结果可以看出,pymongo会将带时区的时间转换为UTC时间然后在存入到monogo中,不带时区的时间就直接当成UTC时间存入到mongo中,所以以后在项目中要存时间的话一定要考虑时区的问题。