我正在尝试使用DateTime.TryParseExact方法,我遇到了一个我不知道的情况.我有一些格式和一些主题解析,每个应该完美匹配一种格式:
var formats = new[] { "%H","HH","Hmm","HHmm","Hmmss","HHmmss",}; var subjects = new[] { "1","12","123","1234","12345","123456",};
然后我尝试解析它们并打印出结果:
foreach(var subject in subjects) { DateTime result; DateTime.TryParseExact(subject,formats,CultureInfo.InvariantCulture,DateTimeStyles.NoCurrentDateDefault,out result); Console.WriteLine("{0,-6} : {1}",subject,result.ToString("T",CultureInfo.InvariantCulture)); }
我得到以下内容:
1 : 01:00:00 12 : 12:00:00 123 : 00:00:00 1234 : 12:34:00 12345 : 00:00:00 123456 : 12:34:56
对我的问题,为什么在123和12345失败?不应该是01:23:00和01:23:45吗?我在这里缺少什么?那我怎么能按照我的期望得到它的工作呢?
更新:所以,似乎我们可能已经弄清楚为什么这是失败的.似乎H实际上是抓住两位数字,然后只留下一个mm,然后会失败.但是,有没有人有一个很好的想法,我可以如何更改这个代码,以便我得到我正在寻找的结果?
另一个更新:想想我现在找到了一个合理的解决方案.将其添加为答案.将会在2天内接受,除非有人想出更好的一个.谢谢您的帮助!
解决方法
好的,所以我想我已经把这一切搞清了,感谢更多的阅读,实验和其他有用的答案.发生的情况是,H,m和s实际上可以抓住两位数字,即使其余的格式不会有足够的数字.所以例如格式Hmm和数字123,H将抓住12,只剩下3.而mm需要两位数字,所以它失败了. Tadaa.
所以,我的解决方案目前是改为使用以下三种格式:
var formats = new[] { "%H","Hm","Hms",};
随着我的问题的其余代码保持不变,我会得到这样的结果:
1 : 01:00:00 12 : 12:00:00 123 : 12:03:00 1234 : 12:34:00 12345 : 12:34:05 123456 : 12:34:56
我认为应该是合理和可接受的:)