var date= DateTime.ParseExact("16-03-2022 1:30", "dd-MM-yyyy HH:mm",
CultureInfo.InvariantCulture);
当我输入
16-03-2022 13:30
时,它不会给出错误,但是当参数为16-03-2022 1:30
时,我收到错误。
如何解决?
我想冒险回答但是..
让我们一步一步来。 .NET 方法的好处之一是您可以在其文档中查看该方法可以引发哪些异常。
来自文档的“异常”部分,它说;
FormatException
或s
是空字符串。format
-或-
不包含与模式对应的日期和时间s
中指定。format
-或-
中的小时部分和 AM/PM 指示符不一致。s
您的
s
或 format
不为空,您的字符串没有任何 AM 或 PM 指示符,因此剩下的唯一选项是“s
不包含与 format
中指定的模式对应的日期和时间
”。作为一个理由。
也来自文档,它说;
将日期和时间的指定字符串表示形式转换为其 使用指定格式和区域性特定的日期时间等效项 格式信息。 字符串表示的格式必须匹配 完全符合指定的格式。
我们所说的“格式”是什么?其中有两个。 自定义日期和时间格式字符串和标准日期和时间格式字符串。由于我们使用的是
DateTime.ParseExact
,因此我们需要考虑使用自定义日期和时间格式。
让我们看看您的
16-03-2022 1:30
字符串中可以解析的所有部分;
dd
)MM
)yyyy
)h
或 H
,因为字符串中没有时间指示符,我们无法知道它采用 12 小时时钟格式 或 24 小时)时钟格式)mm
)因此,您的
16-03-2022 1:30
字符串的正确格式可以是 dd-MM-yyyy H:mm
或 dd-MM-yyyy h:mm
,这取决于 you。如果是 24 小时格式,请使用 H
说明符,如果是 12 小时格式,请使用 h
说明符。
当你在ParseExact()
中看到“
Exact”这个词时,就是这个意思。任何与预期格式的偏差都会导致异常。
在这种情况下,
HH
说明符与小时的1
值不完全匹配。如果您有 01
,它会匹配,但只是 1
不是同一件事。要匹配没有前导零的小时,您需要一个 H
,创建此格式字符串:
dd-MM-yyyy H:mm
这仍会匹配较晚的时间,例如“10”和“11”。此外,大写“H”而不是小写意味着它仍然期望 24 小时时间,因此“13”到“23”之类的数字仍然有效。
如果您可以获得混合值,有时只有
1
,有时可能具有完整的 01
,那么您需要使用接受格式数组的 ParseExact() 重载,并提供两者版本。