首页 > 解决方案 > 将带有微秒的字符串日期时间转换为日期对象

问题描述

我有一个datetime来自 json 数据的2017-03-28T00:00:00.000Z

我试过这个

datetime.datetime.strptime(record_date, "%Y-%m-%d%H:%M:%S%f")

但这会产生错误:

*** ValueError:时间数据 '2017-03-28T00:00:00.000Z' 与格式 '%Y-%m-%d%H:%M:%S%f' 不匹配

我必须将读取日期与用户输入日期作为2017-03-28格式进行比较

标签: python-3.x

解决方案


您的时间是 isoformat,您需要使用 datetime 的 fromisoformat 将其转换为 datetime 对象。

[:-1] 是为了排除 Z 因为 datetime 不明白那是什么。(2017-03-28T00:00:00.000Z 实际上是 RFC 3339)

Z 基本上表示 UTC 时区(格林威治标准时间 +00:00)

from datetime import datetime
foo = "2017-03-28T00:00:00.000Z"
bar = datetime.fromisoformat(foo[:-1]) 
print(bar)
print(type(bar))

给你的结果,但这现在很天真(不知道时区)

2017-03-28 00:00:00
<class 'datetime.datetime'>

使其时区感知的快速解决方法是

bar = datetime.fromisoformat(foo.replace('Z', '+00:00'))
print(bar)
2017-03-28 00:00:00+00:00

#If milliseconds are of concern then just strftime

bar = datetime.fromisoformat(foo.replace('Z', '+00:00')).strftime("%Y-%m-%d %H:%M:%S:%f %Z") 

# the Z displays UTC or equivalent time zone
2017-03-28 00:00:00:000000 UTC

dateutil 模块更擅长处理这个问题,因为它对 RFC 3339 有原生支持。

import dateutil.parser

foo = "2017-03-28T00:00:00.000Z"
bar = dateutil.parser.isoparse(foo)

print(bar)
print(type(bar))

2017-03-28 00:00:00+00:00
<class 'datetime.datetime'>

推荐阅读