47

将日期转换为 JSON 时,javascript 以这种格式保存日期:

2012-05-29T19:30:03.283Z

但是,我不确定如何将其放入 python 日期时间对象中。我试过这些:

# 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格式保存字符串,所以似乎应该有办法让pythondatetime.strptime()读取它?

4

2 回答 2

64

尝试以下格式:

%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

于 2012-05-29T19:44:34.927 回答
13

要提供替代方案,如果您不介意安装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())
于 2017-05-19T16:15:08.240 回答