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

C#TimeSpan.Parse无效格式返回不正确的值而不是异常,c#,timespan,C#,Timespan,Parse(“23:00:00”)返回23小时 解析(“24:00:00”)返回24天 我意识到我犯了一个错误,允许的小时范围是0-23小时。但在几分钟和几秒钟内,如果您试图解析超出范围的值,就会出现异常。在小时值超出范围的情况下,解析器错误地假设您指的是天而不是小时 有人能解释一下吗 本例涵盖了这一主题,并指出 特里帕斯似乎也是如此。我有24天的时间,尽管文档说解析应该失败 我是不是发现了一个bug或者我做错了什么 编辑: 我已经在LinqPad中测试了这一点,并在Windows7 64位

Parse(“23:00:00”)返回23小时

解析(“24:00:00”)返回24天

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

有人能解释一下吗

本例涵盖了这一主题,并指出

特里帕斯似乎也是如此。我有24天的时间,尽管文档说解析应该失败

我是不是发现了一个bug或者我做错了什么

编辑: 我已经在LinqPad中测试了这一点,并在Windows7 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
尝试按顺序使用以下每种格式解析
###··········································

  • hh:mm:ss
    (不变文化)
  • d.hh:mm
    (不变文化)
  • hh:mm:ss
    (本地化)
  • d.hh:mm
    (本地化;有关下面“.”的更多详细信息)
  • 因此:

    • 23:08:09
      在步骤1中成功解析为0d 23h 8m 9s
    • 24:08:09
      在步骤4中成功解析为24d 8h 9m 0s
    如果此行为不适合您,您可以使用:

    更新:根据的文档,在“d”和“hh”之间的“.”是

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

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

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

    您正在比较TryParse和Parse的结果。Parse(String)方法尝试使用当前区域性的每个区域性特定格式来解析字符串(参数)。所以你有天了,这对我来说是个例外。也许这是一种文化@Romil:
    Parse
    在幕后调用
    TryParse
    ,这样它们应该有相同的结果。当我尝试时,这会可靠地生成OverflowException。通过记录.NET版本、区域性以及您在Windows区域设置中应用的任何覆盖来改进您的问题。您的问题不清楚。使用您正在使用的代码更新您的问题。使用.Net 4.0在文档页()上编译准确的代码,对我来说也会返回24天。适用的输出行是
    24:0:0 24.00:00:00
    ,而不是
    24:0:0解析操作失败。
    如何将“XX:00:00”与“d.HH:mm”匹配?字符串中没有句点!这似乎仍然是一个意外的结果。好的,这是最好的解释了。我可以理解为什么代码的行为如此,但我认为这不是记录在案的(预期的/预期的?)行为;实际的行为是相当不幸和令人惊讶的。
    TimeSpan.ParseExact("23:00:00", "hh':'mm':'ss", null) // OK
    TimeSpan.ParseExact("24:00:00", "hh':'mm':'ss", null) // OverflowException
    
    string separator = new NumberFormatInfo(cultureData).NumberDecimalSeparator;
    this.m_fullTimeSpanPositivePattern = "d':'h':'mm':'ss'" + separator + "'FFFFFFF";