我正在尝试解析时间。我已经多次看到这个问题/答案,但不是针对这个具体情况。这是我的代码:
var time1 = DateTime.ParseExact("919", "Hmm", CultureInfo.InvariantCulture);
也
var time2 = DateTime.ParseExact("919", "Hmm", null);
这两个都是相同的
" String未被识别为有效的DateTime"
我想要的是9:19 AM
。
有关详细信息,我还需要将“1305”
解析为1:05 PM
,这很正常。
在我看来,我正在使用正确的格式。我在俯瞰什么?
答案 0 :(得分:10)
我不确定是可以处理此问题的任何格式。问题在于" H"可以是一个数字或两个数字,所以如果有两个数字可用,它将同时抓取 - 在这种情况下将其解析为小时91,这显然是无效的。
理想情况下,您可以将格式更改为HHmm
- 在适当的位置对值进行零填充 - 因此" 0919"会解析好。或者,使用格式的冒号来区分小时和分钟。我不相信有任何办法可以DateTime
解析" 919"如你所愿......所以你需要在解析它之前调整字符串以某种方式。 (我们没有足够的背景来推荐一种特定的方式。)
答案 1 :(得分:2)
是的,您的格式是正确的,但由于H
specifier 可能为2
字符,ParseExact
方法会尝试将91
解析为一小时,这是一个无效的小时,这就是为什么你在这两种情况下得到FormatException
。
4个月前,我联系了微软团队了解这种情况。看一看;
他们建议在字符串中使用2位数字形式或在它们之间插入日期分隔符。
var time1 = DateTime.ParseExact("0919", "Hmm", CultureInfo.InvariantCulture);
或
var time1 = DateTime.ParseExact("9:19", "H:mm", CultureInfo.InvariantCulture);
答案 2 :(得分:0)
您无法将0
前缀排除在小时之外。这工作
var time1 = DateTime.ParseExact("0919", "Hmm", CultureInfo.InvariantCulture);
也许你想在解析之前只用前导零的3个字符前缀。
答案 3 :(得分:0)
非常感谢所有答案。我无法控制正在创建的文本,所以对我来说最简单的解决方案似乎是前缀为零,而不是在中间添加冒号。
var text = "919";
var time = DateTime.ParseExact(text.PadLeft(4, '0'), "Hmm", null);