Python datetime.fromsoformat()拒绝JavaScript日期/时间字符串

Python datetime.fromsoformat()拒绝JavaScript日期/时间字符串,python,Python,为什么以下JS日期字符串失败?它从JS日期对象传递到Python后端 2021-12-31T05:00:00.000Z mydate = datetime.fromisoformat(form['expirationDate']) 错误: ValueError: Invalid isoformat string: '2021-12-31T05:00:00.000Z' 根据isoformat()中的for,似乎没有将“Z”(代表UTC)识别为有效偏移量。将其替换为+00:00似乎有效 其他

为什么以下JS日期字符串失败?它从JS日期对象传递到Python后端

2021-12-31T05:00:00.000Z


mydate = datetime.fromisoformat(form['expirationDate'])
错误:

ValueError: Invalid isoformat string: '2021-12-31T05:00:00.000Z'
根据isoformat()中的for
,似乎没有将“Z”(代表UTC)识别为有效偏移量。将其替换为
+00:00
似乎有效

其他时区不会成为问题,因为它们已经自动用数字偏移表示。例如:
+05:30
对于IST。

根据来自ISOFORMAT()的
,似乎“Z”(代表UTC)未被识别为有效偏移量。将其替换为
+00:00
似乎有效

其他时区不会成为问题,因为它们已经自动用数字偏移表示。例如:
+05:30
用于IST。

根据,
日期。fromisoformat()
仅支持
YYYY-MM-DD
格式

我相信解决这个问题最简单的方法是使用
dateutil.parser.isoparse()

例如:

import dateutil.parser
mydate = dateutil.parser.isoparse('2021-12-31T05:00:00.000Z')
print(mydate)

将正确打印
2021-12-31 05:00:00+00:00

如果您必须使用
datetime
,请查看和/或

编辑:我的错,我把日期时间和日期混淆了,所以。。正如其他人指出的那样,您可以删除尾随的
Z
并根据
date将其命名为day。fromsoformat()
仅支持
YYYY-MM-DD
格式

我相信解决这个问题最简单的方法是使用
dateutil.parser.isoparse()

例如:

import dateutil.parser
mydate = dateutil.parser.isoparse('2021-12-31T05:00:00.000Z')
print(mydate)

将正确打印
2021-12-31 05:00:00+00:00

如果您必须使用
datetime
,请查看和/或


编辑:我的错,我把日期时间和日期混淆了,所以。。正如其他人指出的那样,您可以删除尾随的
Z
并将其终止问题在于字符串末尾的
Z

from datetime import datetime

date = '2021-12-31T05:00:00.000'

t = datetime.fromisoformat(date)
print(t)

问题是字符串末尾的
z

from datetime import datetime

date = '2021-12-31T05:00:00.000'

t = datetime.fromisoformat(date)
print(t)
它失败是因为结尾有“Z”后缀。如果您将其替换为“+00:00”,您将进入业务

Python 3.9.5 (default, May 24 2021, 12:50:35) 
[GCC 11.1.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from datetime import datetime
>>> def fromisoformat(s):
...   return datetime.fromisoformat(s.rstrip("Z") + "+00:00")
... 
>>> fromisoformat("2021-12-31T05:00:00.000Z")
datetime.datetime(2021, 12, 31, 5, 0, tzinfo=datetime.timezone.utc)
>>> 
它失败是因为结尾有“Z”后缀。如果您将其替换为“+00:00”,您将进入业务

Python 3.9.5 (default, May 24 2021, 12:50:35) 
[GCC 11.1.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from datetime import datetime
>>> def fromisoformat(s):
...   return datetime.fromisoformat(s.rstrip("Z") + "+00:00")
... 
>>> fromisoformat("2021-12-31T05:00:00.000Z")
datetime.datetime(2021, 12, 31, 5, 0, tzinfo=datetime.timezone.utc)
>>>