当毫秒为零时,PyMongo存储ISODate而没有毫秒

时间:2013-05-30 23:24:00

标签: python mongodb pymongo isodate

今天运行脚本后,我注意到我的某些文档的created_on时间如下:

ISODate(“2013-05-30T17:46:55Z”) no millis

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

解析前一个代码时,我的代码期望millis在那里:

    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”)存储在文档中以便解析器可以保持一致?

1 个答案:

答案 0 :(得分:2)

一个选项是,将日期时间存储为MongoDB中的日期时间,而不是字符串。然后你不需要用strptime解析它们以便将日期时间取消并且毫秒没有问题:

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