gpt4 book ai didi

C# TimeSpan.Parse 无效格式返回不正确的值而不是异常

转载 作者:IT王子 更新时间:2023-10-29 04:44:30 24 4
gpt4 key购买 nike

TimeSpan.Parse("23:00:00") 返回 23 小时。

TimeSpan.Parse("24:00:00") 返回 24 天!

我意识到我犯了一个错误,允许的小时范围是 0-23。但是在几分钟和几秒钟内,如果您尝试解析超出范围的值,您会得到一个异常。如果小时的值超出范围,解析器会错误地假定您指的是天而不是小时。

谁能解释一下?

这里的这个例子涵盖了这个主题并表明 http://msdn.microsoft.com/en-us/magazine/ee309881.aspx

TryParse 似乎也是如此。尽管文档指出解析应该失败,但我有 24 天的时间。

http://msdn.microsoft.com/en-us/library/3z48198e

//            String to Parse                TimeSpan
// --------------- ---------------------
// 0 00:00:00
// 14 14.00:00:00
// 1:2:3 01:02:03
// 0:0:0.250 00:00:00.2500000
// 10.20:30:40.50 10.20:30:40.5000000
// 99.23:59:59.9999999 99.23:59:59.9999999
// 0023:0059:0059.0099 23:59:59.0099000
// 23:0:0 23:00:00
// 24:0:0 Parse operation failed.
// 0:59:0 00:59:00
// 0:60:0 Parse operation failed.
// 0:0:59 00:00:59
// 0:0:60 Parse operation failed.
// 10: Parse operation failed.
// 10:0 10:00:00
// :10 Parse operation failed.
// 0:10 00:10:00
// 10:20: Parse operation failed.
// 10:20:0 10:20:00
// .123 Parse operation failed.
// 0.12:00 12:00:00
// 10. Parse operation failed.
// 10.12 Parse operation failed.
// 10.12:00 10.12:00:00

我是发现了错误还是做错了什么?

编辑:我已经在 LinqPad 中对此进行了测试,并在 Windows 7 64 位上使用 .NET4 中的控制台应用程序。

            var result = TimeSpan.Parse("24:00:00");
Console.WriteLine(result);
result = TimeSpan.Parse("24:00:00", CultureInfo.InvariantCulture);
Console.WriteLine(result);

这导致:

24.00:00:00
24.00:00:00

最佳答案

发生的事情是 TimeSpan.Parse 尝试按顺序使用以下每种格式解析 ##:##:##,一旦出现一个就停止成功:

  1. hh:mm:ss(不变文化)
  2. d.hh:mm(不变文化)
  3. hh:mm:ss(本地化)
  4. d.hh:mm(已本地化;有关下面“.”的更多详细信息)

所以:

  • 23:08:09 在第 1 步中成功解析为 0d 23h 8m 9s。
  • 24:08:09 在第 4 步中成功解析为 24d 8h 9m 0s。

如果这种行为不适合你,你可以使用 TimeSpan.ParseExact相反:

TimeSpan.ParseExact("23:00:00", "hh':'mm':'ss", null) // OK
TimeSpan.ParseExact("24:00:00", "hh':'mm':'ss", null) // OverflowException

更新:根据 TimeSpan.Parse 的文档, 这 ”。” "d"和 "hh"之间是

A culture-sensitive symbol that separates days from hours. The invariant format uses a period (".") character.

但是,我使用 Reflector 深入研究了框架源代码,结果发现,在本地化格式中,这个所谓的“文化敏感”符号始终是一个冒号!以下是内部 DateTimeFormatInfo.FullTimeSpanPositivePattern 属性的摘录:

string separator = new NumberFormatInfo(cultureData).NumberDecimalSeparator;
this.m_fullTimeSpanPositivePattern = "d':'h':'mm':'ss'" + separator + "'FFFFFFF";

关于C# TimeSpan.Parse 无效格式返回不正确的值而不是异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11157750/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com