将 JSON 日期字符串转换为 Python 日期时间

Posted

技术标签:

【中文标题】将 JSON 日期字符串转换为 Python 日期时间【英文标题】:Convert JSON date string to Python datetime 【发布时间】:2012-06-04 01:21:52 【问题描述】:

将日期转换为 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格式的,所以看来应该有办法让python的datetime.strptime()读取呢?

【问题讨论】:

去掉“Z”前面的%,我觉得应该可以。 这不是删除“Z”所传达的信息吗? @ChrisDutrow Z 是字符串中要忽略的字符 【参考方案1】:

试试下面的格式:

%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

【讨论】:

如何去掉日期中的时间部分?仅尝试使用 %Y-%m-%d%Y-%m-%dT 时,它似乎不起作用。谢谢! 没关系,用datetime.strptime(date, '%Y-%m-%dT%H:%M:%S.%fZ').strftime("%m/%d/%y")搞定了【参考方案2】:

要提供替代方案,如果您不介意安装 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())

【讨论】:

保留时区很重要。我更喜欢你的回答。

以上是关于将 JSON 日期字符串转换为 Python 日期时间的主要内容,如果未能解决你的问题,请参考以下文章

将 Json 日期字符串转换为 JavaScript 日期对象

将JSON字符串转换为日期[重复]

将 JavaScript Date 对象转换为 JSON 字符串时日期更改为前一天

json中的String类型的日期为啥自动转换成date类型

Python将日期时间字符串转换为日期

JS:将字符串转换为日期的错误