django 转换字符串datetime最后9位数字转换为ISO格式datetime对象在Python中

dl5txlt9  于 2023-06-25  发布在  Go
关注(0)|答案(2)|浏览(128)

我有字符串日期时间(例如:“2022-11-11T06:19:32.776289776Z”)。我想转换成ISO格式。
我试着在下面

>>> datetime.datetime.fromisoformat("2022-11-11T06:19:32.776289776Z")

但它是抛出错误。
ValueError: Invalid isoformat string: '2022-11-11T06:19:32.776289776Z
如果我在最后一个没有Z的地方只给予6位数,它就有效。
下面的例子对我来说是有效的,但是不适用于9位数和z的字符串:

>>> datetime.datetime.fromisoformat("2022-11-11T06:19:32.776289")

datetime.datetime(2022, 11, 11, 6, 19, 32, 776289)
hmmo2u0o

hmmo2u0o1#

如果Python 3.11可用

如果你可以升级到Python 3.11,那么fromisoformat可以处理这个问题:

# Python 3.11 and above only
dt = datetime.datetime.fromisoformat("2022-11-11T06:19:32.776289776Z")
print(dt)

给予

2022-11-11 06:19:32.776289+00:00

Python早期版本

如果您仅限于早期版本的Python,那么正如@SalmanA在评论中所说的那样,您可以通过以下方式获得有效的时间戳:(1)使用re.sub将微秒缩短到6位数,以及(2)将Z替换为+00:00str.replace将完成此操作)。
这假设时间戳以其他方式被有效地格式化(例如,字符串中的任何其他地方都没有字母Z)。
例如:

import datetime
import re

def clean_str(ts):
    return re.sub("(\d{6})(\d+)", r"\1", ts).replace("Z", "+00:00")

tests = ["2022-11-11T06:19:32.776289776Z",
         "2022-11-11T06:19:32.776289Z",
         "2022-11-11T06:19:32.7762897+03:00",
         "2022-11-11T06:19:32.776Z"]

for i, ts in enumerate(tests, 1):
    clean = clean_str(ts)
    dt = datetime.datetime.fromisoformat(clean)
    print(f"({i}): {ts} -> {clean} -> {dt}")

给出:

(1): 2022-11-11T06:19:32.776289776Z -> 2022-11-11T06:19:32.776289+00:00 -> 2022-11-11 06:19:32.776289+00:00
(2): 2022-11-11T06:19:32.776289Z -> 2022-11-11T06:19:32.776289+00:00 -> 2022-11-11 06:19:32.776289+00:00
(3): 2022-11-11T06:19:32.7762897+03:00 -> 2022-11-11T06:19:32.776289+03:00 -> 2022-11-11 06:19:32.776289+03:00
(4): 2022-11-11T06:19:32.776Z -> 2022-11-11T06:19:32.776+00:00 -> 2022-11-11 06:19:32.776000+00:00

注意,如⑴和⑶所示,微秒被截断,而不是舍入,即32.776289776会转到32.776289,而不是32.776290。(原生Python 3.11解决方案也是如此。)如果你想要真正的舍入,那么你需要进一步解析字符串。

k5ifujac

k5ifujac2#

您可以在dateutil中使用更“宽松”的解析器。实际上,您安装了python-dateutil [PyPi]包。这将用任意数量的数字进行解析,* 但是 *... datetime的 * 分辨率 * 为微秒,这意味着它不会存储 * 六位数字之后的详细信息,因此它会忽略其余的数字:

>>> from dateutil import parser
>>> parser.isoparse('2022-11-11T06:19:32.776289776Z')
datetime.datetime(2022, 11, 11, 6, 19, 32, 776289, tzinfo=tzutc())

因此省略了…776部分。

相关问题