如何解决 stringFormat Exception 错误?

问题描述 投票:0回答:2

 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
时,我收到错误。

如何解决?

c# .net datetime datetime-format
2个回答
1
投票

我想冒险回答但是..

让我们一步一步来。 .NET 方法的好处之一是您可以在其文档中查看该方法可以引发哪些异常。

来自文档的“异常”部分,它说;

FormatException

s
format
是空字符串。

-或-

s
不包含与模式对应的日期和时间
format
中指定。

-或-

s
中的小时部分和 AM/PM 指示符不一致。

您的

s
format
不为空,您的字符串没有任何 AM 或 PM 指示符,因此剩下的唯一选项是“
s
不包含与
format 中指定的模式对应的日期和时间
”。作为一个理由。

也来自文档,它说;

将日期和时间的指定字符串表示形式转换为其 使用指定格式和区域性特定的日期时间等效项 格式信息。 字符串表示的格式必须匹配 完全符合指定的格式。

我们所说的“格式”是什么?其中有两个。 自定义日期和时间格式字符串标准日期和时间格式字符串。由于我们使用的是

DateTime.ParseExact
,因此我们需要考虑使用自定义日期和时间格式。

让我们看看您的

16-03-2022 1:30
字符串中可以解析的所有部分;

  • 16 --> 两位数日期数字 (
    dd
    )
  • 03 --> 带前导零的两位数月份数字 (
    MM
    )
  • 2022 --> 四位数年份 (
    yyyy
    )
  • 1 --> 一位数字小时(可以是
    h
    H
    ,因为字符串中没有时间指示符,我们无法知道它采用 12 小时时钟格式24 小时)时钟格式
  • 30 --> 两位数分钟 (
    mm
    )

因此,您的

16-03-2022 1:30
字符串的正确格式可以是
dd-MM-yyyy H:mm
dd-MM-yyyy h:mm
,这取决于 you。如果是 24 小时格式,请使用
H
说明符,如果是 12 小时格式,请使用
h
说明符。


1
投票

当你在ParseExact()中看到“

Exact
”这个词时,就是这个意思。任何与预期格式的偏差都会导致异常。

在这种情况下,

HH
说明符与小时的
1
值不完全匹配。如果您有
01
,它会匹配,但只是
1
不是同一件事。要匹配没有前导零的小时,您需要一个
H
,创建此格式字符串:

dd-MM-yyyy H:mm

这仍会匹配较晚的时间,例如“10”和“11”。此外,大写“H”而不是小写意味着它仍然期望 24 小时时间,因此“13”到“23”之类的数字仍然有效。

如果您可以获得混合值,有时只有

1
,有时可能具有完整的
01
,那么您需要使用接受格式数组ParseExact() 重载,并提供两者版本。

© www.soinside.com 2019 - 2024. All rights reserved.