Python PyMongo在毫秒为零时不使用毫秒存储ISODate

Python PyMongo在毫秒为零时不使用毫秒存储ISODate,python,mongodb,pymongo,isodate,Python,Mongodb,Pymongo,Isodate,今天运行脚本后,我注意到为我的一些文档按时创建的_如下所示: ISODate(“2013-05-30T17:46:55Z”)无毫秒 大多数行的ISODate(“2013-05-30T21:08:02.261Z”)毫秒 在分析前者时..我的代码预期Milli会出现: dt = datetime.strptime(dt, '%Y-%m-%d %H:%M:%S.%f') File "/usr/lib/python2.7/_strptime.py", line 325, in _strp

今天运行脚本后,我注意到为我的一些文档按时创建的_如下所示:

ISODate(“2013-05-30T17:46:55Z”)无毫秒

大多数行的ISODate(“2013-05-30T21:08:02.261Z”)毫秒

在分析前者时..我的代码预期Milli会出现:

    dt = datetime.strptime(dt, '%Y-%m-%d %H:%M:%S.%f')
    File "/usr/lib/python2.7/_strptime.py", line 325, in _strptime (data_string, format))
    ValueError: time data '2013-05-30 17:46:55' does not match format '%Y-%m-%d %H:%M:%S.%f'

如何确保将ISODate(“2013-05-30T17:46:55.0000Z”)存储在文档中,以便解析器能够保持一致?

一个选项是,将datetimes存储为MongoDB中的datetimes,而不是字符串。然后,您不需要使用
strtime
解析它们,就可以恢复日期时间,毫不成问题:

>>> dt = datetime.now()
>>> str(dt)
'2013-06-03 13:04:22.976182'
>>> db.collection.insert({'now': dt})
ObjectId('51accca7ca1ce90a4277ac20')
>>> dt = datetime.now().replace(microsecond=0)
>>> str(dt)
'2013-06-03 13:04:47'
>>> db.collection.insert({'now': dt})
ObjectId('51acccb6ca1ce90a4277ac21')
>>> pprint.pprint(list(db.collection.find({}, {'now': True, '_id': False})))
[{u'now': datetime.datetime(2013, 6, 3, 13, 4, 22, 976000)},
 {u'now': datetime.datetime(2013, 6, 3, 13, 4, 47)}]
如果更改存储日期时间的方式为时已晚,您可以
pip安装python dateutil
并执行以下操作:

>>> from dateutil.parser import parse
>>> parse('2013-06-03 13:04:22.976182')
datetime.datetime(2013, 6, 3, 13, 4, 22, 976182)
>>> parse('2013-06-03 13:04:22')
datetime.datetime(2013, 6, 3, 13, 4, 22)
使用
datetime.utcnow()
代替
datetime.now()