20

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
4

1 回答 1

13

正在发生的事情是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”之间是

区分天数和小时数的文化敏感符号。不变格式使用句点(“.”)字符。

然而,我用 Reflector 挖掘了框架源代码,结果发现,在本地化格式中,这个所谓的“文化敏感”符号总是一个冒号!DateTimeFormatInfo.FullTimeSpanPositivePattern这是内部属性的摘录:

string separator = new NumberFormatInfo(cultureData).NumberDecimalSeparator;
this.m_fullTimeSpanPositivePattern = "d':'h':'mm':'ss'" + separator + "'FFFFFFF";
于 2012-06-22T15:17:02.710 回答