【发布时间】:2017-07-10 21:49:17
【问题描述】:
我有一个没有字段分隔符的时间和日期值,我正在尝试使用TryParseExact 将其解析为DateTime。时间组件有一位数的小时和两位数的分钟和秒。
下面的表达式:
DateTime.ParseExact("20170101 84457", "yyyyMMdd Hmmss",
System.Globalization.CultureInfo.InvariantCulture)
导致FormatException 出现消息“字符串未被识别为有效的日期时间。”。我假设这是因为时间无法明确解决,但是由于 mm 和 ss 总是每个都是两位数,我不明白为什么这会是一个问题。
以下结果解析成功:
- 破解输入时间以包含分隔符(例如,“8:44:57”和“H:mm:ss”)
- 如果
这两个似乎都有些小技巧。
【问题讨论】:
-
这可能是一个 hack,但强制使用 0 前缀可能就是你必须要做的。
-
看来原因是 ParseExact 是如何在后台工作的,它试图在可能的情况下贪婪地检索两个字符。这里有行为的细分:stackoverflow.com/questions/2016206/…
-
是的,这似乎是问题所在。
DateTime.ParseExact最终调用DateTimeParse.DoStrictParse,即使您指定H,它仍然会抓取两位数来计算小时。如果你真的想看看它是如何工作的,源代码在这里:referencesource.microsoft.com/mscorlib/R/f1835935628e4a2f.html -
格式 H 表示值可以在 0 到 23 之间。很明显,即使格式已指定为 H,值仍然可以是 2 位数。也许这就是为什么要读取 2 位来形成 H 的原因。
-
@nullPainter 您也可以在我的回答中看到 .NET 团队针对这种情况提出的建议。 stackoverflow.com/a/26778076/447156