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

时间:2012-06-22 14:03:19

标签: c# timespan

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

1 个答案:

答案 0 :(得分:10)

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

  1. hh:mm:ss(不变文化)
  2. d.hh:mm(不变文化)
  3. hh:mm:ss(已本地化)
  4. d.hh:mm(本地化;有关“。”的更多详情)
  5. 所以:

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

    如果此行为不适合您,您可以改为使用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";