python不会将日期字符串转换为日期时间

python不会将日期字符串转换为日期时间,python,Python,以下是我在python 2.7中的日期时间格式: dt = "2018-12-28T21:59:59.434645118Z" now_utc = datetime.datetime.strptime(dt, "%Y-%m-%dT%H:%M:%S.%fZ") 错误: ValueError: time data '2018-12-28T21:59:59.434645118Z' does not match format '%Y-%m-%dT%H:%M:%S.%fZ' 我有微秒和%f。。我还缺什么

以下是我在python 2.7中的日期时间格式:

dt = "2018-12-28T21:59:59.434645118Z"
now_utc = datetime.datetime.strptime(dt, "%Y-%m-%dT%H:%M:%S.%fZ")
错误:

ValueError: time data '2018-12-28T21:59:59.434645118Z' does not match format '%Y-%m-%dT%H:%M:%S.%fZ'
我有微秒和%f。。我还缺什么


谢谢

您遇到的问题是您的时间以纳秒为单位,而Python datetime模块目前没有纳秒的功能

如果应用程序允许,最好的选择是将时间分辨率降低到微秒

以下是解决此问题的方法:

dt = "2018-12-28T21:59:59.434645118Z"
p1,p2 = dt.rsplit('.',1)
new_dt = "{}.{}Z".format(p1,p2[:-1][:6])
now_utc = datetime.datetime.strptime(new_dt, "%Y-%m-%dT%H:%M:%S.%fZ")
p1代表“2018-12-28 21:59:59”

p2表示秒的浮点部分,对于datetime来说太大了(它是纳米精度)——因此我们将其限制为6位([:-1]删除Z,[:6]仅限制为微秒)。这会将分辨率降低到微秒,无需舍入,只需截断。如果需要舍入,可以将p2强制转换为浮点,将其舍入,然后强制转换回str并截断结尾

这将使您的时间分辨率降低到datetime可以处理的程度。这也假设你的秒数总是一个浮点数,并以某个点结束。如果没有,您可能需要调整正则表达式,但我试图尽可能清楚地说明示例


我相信有一个更简单的方法可以做到这一点,但这首先出现在我的脑海中,现在已经很晚了。我正在考虑直接操作dt字符串,但我不确定9位数字是否总是在小数部分。祝你好运

允许的微秒范围为

0 <= microsecond < 1000000
一种解决方案是保持微秒子串,使其保持在最大值以下。我相信还有其他方法可以做到这一点。这正是我现在能想到的

import datetime
max=1000000
dt = "2018-12-28T21:59:59.434645118Z"
dt_list=dt.split('.')
current_micro_sec=dt_list[1][:-1]
while int(current_micro_sec)>max:
    current_micro_sec=current_micro_sec[:-1]
    dt=dt_list[0]+'.'+current_micro_sec+'Z' #keep this inside only if > max otherwise preserve dt
now_utc = datetime.datetime.strptime(dt, "%Y-%m-%dT%H:%M:%S.%fZ")
print(now_utc)
试试这个

from time import gmtime, strftime
import time

print(strftime("%Y-%m-%dT%H:%M:%S.%fZ", gmtime()))

如果在微秒内删除最后3个数字,保留Z,也就是说,如果在微秒内保留6个字符,它将起作用。
from time import gmtime, strftime
import time

print(strftime("%Y-%m-%dT%H:%M:%S.%fZ", gmtime()))