与 DateTime.ParseExact 的短时间

Short Time with DateTime.ParseExact

我正在尝试解析时间。我在这里多次看到这个问题 asked/answered 但不是针对这种特定情况。这是我的代码:

var time1 = DateTime.ParseExact("919", "Hmm", CultureInfo.InvariantCulture);

还有

var time2 = DateTime.ParseExact("919", "Hmm", null);

这两个都抛出相同的

"String was not recognized as a valid DateTime"

我要的是9:19 AM.

有关更多信息,我还需要将 “1305” 解析为 1:05 PM,这工作正常。

在我看来,我使用的格式是正确的。我忽略了什么?

您不能排除小时的 0 前缀。这行得通

var time1 = DateTime.ParseExact("0919", "Hmm", CultureInfo.InvariantCulture);

也许您只想在解析前在 3 个字符的时间前加上一个前导零。

我不确定 是否有任何格式可以处理此问题。问题是 "H" 可以是一个数字或两个数字,所以如果有两个数字可用,它会抓取两个 - 在这种情况下将其解析为小时 91,这显然是无效的。

理想情况下,您可以将格式更改为 HHmm - 在适当的地方对值进行零填充 - 这样“0919”就可以正常解析了。或者,在格式中使用冒号来区分小时和分钟。我不相信有任何方法可以让 DateTime 解析你想要的值“919”...所以你需要以某种方式调整字符串 在解析它之前。 (我们没有足够的上下文来推荐一种特定的方法。)

是的,你的格式是正确的,但由于 H specifier 可能 2 字符,ParseExact 方法尝试解析 91 作为一个小时,这是一个无效的小时,这就是为什么在这两种情况下你都会得到 FormatException

4 个月前我就此情况联系了 Microsoft 团队。看看;

  • DateTime conversion from string C#

他们建议在您的字符串中使用 2 位数字形式或在它们之间插入日期分隔符。

var time1 = DateTime.ParseExact("0919", "Hmm", CultureInfo.InvariantCulture);

var time1 = DateTime.ParseExact("9:19", "H:mm", CultureInfo.InvariantCulture);

非常感谢所有的回答。我无法控制正在创建的文本,因此对我来说最简单的解决方案似乎是在前面加上一个零,而不是在中间添加一个冒号。

var text = "919";

var time = DateTime.ParseExact(text.PadLeft(4, '0'), "Hmm", null);