首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C# TimeSpan.Parse无效格式返回不正确的值,而不是异常

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

Stack Overflow用户
提问于 2012-06-22 22:03:19
回答 1查看 3.3K关注 0票数 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

代码语言:javascript
复制
//            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

是我发现了bug,还是我做错了什么?

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

代码语言:javascript
复制
            var result = TimeSpan.Parse("24:00:00");
            Console.WriteLine(result);
            result = TimeSpan.Parse("24:00:00", CultureInfo.InvariantCulture);
            Console.WriteLine(result);

这将导致:

代码语言:javascript
复制
24.00:00:00
24.00:00:00
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-22 23:17:03

实际情况是,TimeSpan.Parse尝试按顺序使用以下每种格式解析##:##:##,一旦解析成功就停止:

  1. hh:mm:ss (不变culture)
  2. d.hh:mm (不变culture)
  3. hh:mm:ss (localized)
  4. d.hh:mm (本地化;有关".“的更多详细信息。下图)

所以:

在步骤4中,

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

如果此行为不适合您,您可以改用TimeSpan.ParseExact

代码语言:javascript
复制
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属性的摘录:

代码语言:javascript
复制
string separator = new NumberFormatInfo(cultureData).NumberDecimalSeparator;
this.m_fullTimeSpanPositivePattern = "d':'h':'mm':'ss'" + separator + "'FFFFFFF";
票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11157750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档