为什么TimeSpan.ParseExact不起作用

Qua*_*ngo 37 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);
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*Jon 79

文档:

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

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

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

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

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

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

TimeSpan.ParseExact(tmp, "hh\\:mm\\:ss", CultureInfo.InvariantCulture)
Run Code Online (Sandbox Code Playgroud)

  • 很好的回答,Jon - 我从未意识到`ParseExact`忽略了格式化程序的12/24小时约定. (5认同)
  • 毕竟,如果它能正常工作将太容易了……那真是太怪诞了…… (2认同)

M. *_*ara 8

试试这个:

var t2 = TimeSpan.ParseExact(tmp, "c", System.Globalization.CultureInfo.InvariantCulture);
Run Code Online (Sandbox Code Playgroud)

来源: 标准TimeSpan格式字符串


sam*_*gak 6

如果您不想处理TimeSpan.ParseExact和之间格式说明符的差异,DateTime.ParseExact您可以将字符串解析为 aDateTime并获取TimeOfDay组件,如下所示TimeSpan

var t2 = DateTime.ParseExact(tmp, "hh:mm:ss", CultureInfo.InvariantCulture).TimeOfDay;
Run Code Online (Sandbox Code Playgroud)