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
是我发现了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
发布于 2012-06-22 23:17:03
实际情况是,TimeSpan.Parse
尝试按顺序使用以下每种格式解析##:##:##
,一旦解析成功就停止:
hh:mm:ss
(不变culture)d.hh:mm
(不变culture)hh:mm:ss
(localized)d.hh:mm
(本地化;有关".“的更多详细信息。下图)所以:
在步骤4中,
23:08:09
被成功解析为0d 23h 8m 9s在步骤4中1.24:08:09
被成功解析为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";
https://stackoverflow.com/questions/11157750
复制相似问题