将日期转换为JSON时,javascript会以这种格式保存日期:
2012-05-29T19:30:03.283Z
但是,我不知道如何将它变成python datetime对象。我试过这些:
# Throws an error because the 'Z' isn't accounted for:
datetime.datetime.strptime(obj[key], '%Y-%m-%dT%H:%M:%S.%f')
# Throws an error because '%Z' doesn't know what to do with the 'Z'
# at the end of the string
datetime.datetime.strptime(obj[key], '%Y-%m-%dT%H:%M:%S.%f%Z')
我相信javascript正在以官方ISO格式保存字符串,所以似乎应该有办法让python的datetime.strptime()
读取它?
答案 0 :(得分:40)
请尝试以下格式:
%Y-%m-%dT%H:%M:%S.%fZ
例如:
>>> datetime.datetime.strptime('2012-05-29T19:30:03.283Z', '%Y-%m-%dT%H:%M:%S.%fZ')
datetime.datetime(2012, 5, 29, 19, 30, 3, 283000)
日期中的Z
仅表示它应被解释为UTC时间,因此忽略它不会导致任何信息丢失。您可以在此处找到此信息:http://www.w3.org/TR/NOTE-datetime
答案 1 :(得分:5)
要提供替代方案,如果您不介意安装python-dateutil
包,则可以使用dateutil.parser.parse
。请注意,输入的格式由parse
猜测;仍然可以正确或以其他方式解释无效输入。
如果您不想设置时区,如果您在内部表示所有时间仅为UTC,则完全没问题,请使用:
>>> dateutil.parser.parse('2012-05-29T19:30:03.283Z', ignoretz=True)
datetime.datetime(2012, 5, 29, 19, 30, 3, 283000)
请注意,与datetime.datetime.strptime
不同,此parse
的默认调用会自动保留UTC时区。
>>> import dateutil.parser
>>> dateutil.parser.parse('2012-05-29T19:30:03.283Z')
datetime.datetime(2012, 5, 29, 19, 30, 3, 283000, tzinfo=tzutc())
如果需要进行相等的测试断言,则可以将预期对象构造为:
>>> import datetime
>>> datetime.datetime(2012, 5, 29, 19, 30, 3, 283000, tzinfo=dateutil.tz.tzutc())