为什么TimeSpan.ParseExact不起作用

时间:2012-07-30 09:52:25

标签: c# parsing timespan

这有点奇怪。如果我试着准确的话,解析具有有效时间跨度的文本字段会失败!

const string tmp = "17:23:24";
//works
var t1 = TimeSpan.Parse(tmp);
//fails
var t2 = TimeSpan.ParseExact(tmp, "hh:mm:ss", System.Globalization.CultureInfo.InvariantCulture);

第二个解析失败,异常“输入字符串格式不正确”。来自DateTime。

6 个答案:

答案 0 :(得分:69)

来自documentation

  

格式字符串中的任何其他未转义字符,包括   空格字符,被解释为自定义格式说明符。在   在大多数情况下,任何其他未转义字符的存在都会导致a   出现FormatException。

     

有两种方法可以在格式字符串中包含文字字符:

     
      
  • 将其用单引号括起来(文字字符串分隔符)。

  •   
  • 在前面加上反斜杠(“\”),它被解释为转义字符。这意味着,在C#中,格式字符串必须   要么是@ -quoted,要么文字字符必须以a开头   额外的反斜杠。

  •   
     

.NET Framework没有及时为分隔符定义语法   间隔。这意味着天和小时之间的分隔符,   小时和分钟,分钟和秒,以及秒和分数   第二个必须全部被视为格式字符串中的字符文字。

因此,解决方案是将格式字符串指定为

TimeSpan.ParseExact(tmp, "hh\\:mm\\:ss", CultureInfo.InvariantCulture)

答案 1 :(得分:8)

试试这个:

var t2 = TimeSpan.ParseExact(tmp, "c", System.Globalization.CultureInfo.InvariantCulture);

来源: Standard TimeSpan Format Strings

答案 2 :(得分:4)

如果您不想处理TimeSpan.ParseExactDateTime.ParseExact之间格式说明符的差异,您只需将字符串解析为DateTime并获取{{1像这样的TimeOfDay组件:

TimeSpan

答案 3 :(得分:2)

似乎HH并非真正用于TimeSpan

  

自定义TimeSpan格式说明符不包含占位符   分隔符号,例如将小时与小时分开的符号,   几分钟或几秒钟的小时数。相反,这些   符号必须作为字符串包含在自定义格式字符串中   文字。例如,“dd.hh \:mm”将句点(。)定义为   天和小时之间的分隔符,以及冒号(:)作为分隔符   小时和分钟之间。

因此正确的方式是Jon提到使用“\” Read More来逃避

<击> 您的TimeSpan “17:23:24”这是24小时格式,应该使用HH格式解析,而不是hh 12小时格式。

TimeSpan.ParseExact(tmp, "HH:mm:ss",System.Globalization.CultureInfo.InvariantCulture);

查看the formats

答案 4 :(得分:0)

试试这个:

     var t2 = TimeSpan.ParseExact(tmp, "HH:mm:ss", System.Globalization.CultureInfo.InvariantCulture);

答案 5 :(得分:0)

使用此 有用 使用

TimeSpan.ParseExact(value, “h\\:mm”, CultureInfo.InvariantCulture);