当前位置: 首页 > 编程语言 > C#

C#学习教程:.NET:为什么TryParseExact在Hmm和Hmmss上失败?

时间:2023-04-10 17:38:57 C#

.NET:为什么TryParseExact在Hmm和Hmmss上失败?我正在尝试使用DateTime.TryParseExact方法,但遇到了我无法解决的情况。我有一些格式和一些主题来解析每种格式应该与其中一种格式完全匹配:varformats=new[]{"%H","HH","Hmm","HHmm","Hmmss","HHmmss",};varsubjects=new[]{"1","12","123","1234","12345","123456",};然后我尝试解析它们并打印出结果:foreach(varsubjectinsubjects){DateTimeresult;DateTime.TryParseExact(主题,格式,CultureInfo.InvariantCulture,DateTimeStyles.NoCurrentDateDefault,输出结果);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需要两位数字,所以它失败了。中大。所以,我的解决方案目前只使用以下三种格式:varformats=new[]{"%H","Hm","Hms",};由于我问题中的其余代码保持不变,我将得到结果:1:01:00:0012:12:00:00123:12:03:001234:12:34:0012345:12:34:05123456:12:34:56我认为它应该是合理且可以接受的:)0123012345我猜它在找到一串这样的数字时会查找2/4/6的长度。123应该是上午还是下午?0123没有那么含糊。如果您不在自定义格式模式中使用日期或时间分隔符,请使用提供者参数的不变区域性和每个自定义格式说明符的最宽格式。例如,如果要在模式中指定小时数,请指定较宽的形式“HH”,而不是较窄的形式“H”引用:http://msdn.microsoft.com/en-us/library/ms131044.aspx正如其他人指出的那样,H是不明确的,因为它表示每天10小时,而HH是12引用MSDN的使用单个自定义格式说明符:由两个或多个字符组成的自定义日期和时间格式字符串。例如,如果格式字符串仅包含说明符h,则格式字符串将被解释为标准日期和时间格式说明符。但是,在这种特殊情况下,会抛出异常,因为没有标准的日期和时间格式说明符。要使用单个自定义日期和时间格式说明符,请在日期和时间说明符之前或之后包含一个空格,或者在单个自定义日期和时间说明符之前包括一个百分比(%)格式说明符。例如,格式字符串“h”和“%h”被解释为自定义日期和时间格式字符串,显示当前日期和时间值表示的小时。请注意,如果使用空格,它将在结果字符串中显示为文字字符。那么,%H应该在格式数组的第一个元素中吗?希望这有帮助,最好的问候,汤姆。我可能是错的,但我怀疑这可能与格式字符串的“H”部分固有的歧义有关——即,给定字符串“123”,你可以处理小时“1”(01:00)或小时“12”(12:00);由于TryParseExact不知道哪个是正确的,因此它返回false。至于为什么这种方法不提供“最佳猜测”:恐怕文档不在您身边。来自DateTime.TryParse的MSDN文档(强调我的):当此方法返回时,如果转换成功,它包含一个DateTime值,该值等于s中包含的日期和时间,如果转换失败,则包含一个DateTime.MinValue。如果s或format参数为null、为空字符串或不包含与format中指定的模式相对应的日期和时间,则转换将失败。此参数在未初始化的情况下传递。对于TryParseExact方法,“123”和“12345”似乎不明确。例如,“12345”可能是12:34:50或01:23:45。只是一个猜测。以上是C#学习教程:.NET:WhydoesTryParseExactfailonHmmandHmmss?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: