C# · 12月 27, 2021

c# – .NET:为什么TryParseExact在Hmm和Hmmss上失败?

我正在尝试使用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:0012 : 12:00:00123 : 00:00:001234 : 12:34:0012345 : 00:00:00123456 : 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:0012 : 12:00:00123 : 12:03:001234 : 12:34:0012345 : 12:34:05123456 : 12:34:56

我认为应该是合理和可接受的:)