这有点奇怪。如果我试图准确,解析具有有效时间跨度的文本字段会失败!
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);
第二次解析失败,出现异常“输入字符串的格式不正确”。从日期时间。
从文档中:
格式字符串中的任何其他未转义字符(包括空格字符)都被解释为自定义格式说明符。在大多数情况下,任何其他未转义字符的存在都会导致 FormatException。
有两种方法可以在格式字符串中包含文字字符:
将其括在单引号中(文字字符串分隔符)。
在它前面加上一个反斜杠(“\”),它被解释为一个转义字符。这意味着,在 C# 中,格式字符串必须用 @ 引号括起来,或者文字字符前面必须有一个额外的反斜杠。
.NET Framework 没有为时间间隔中的分隔符定义语法。这意味着天和小时、小时和分钟、分钟和秒以及秒和秒的小数部分之间的分隔符都必须被视为格式字符串中的字符文字。
因此,解决方案是将格式字符串指定为
TimeSpan.ParseExact(tmp, "hh\\:mm\\:ss", CultureInfo.InvariantCulture)
试试这个:
var t2 = TimeSpan.ParseExact(tmp, "c", System.Globalization.CultureInfo.InvariantCulture);
如果您不想处理 和 之间格式说明符的差异TimeSpan.ParseExact
,DateTime.ParseExact
您可以将字符串解析为 aDateTime
并像这样获取TimeOfDay
组件TimeSpan
:
var t2 = DateTime.ParseExact(tmp, "hh:mm:ss", CultureInfo.InvariantCulture).TimeOfDay;
看来HH并不是真的适合TimeSpan
自定义 TimeSpan 格式说明符不包括占位符分隔符,例如将天与小时、小时与分钟或秒与小数秒分开的符号。相反,这些符号必须作为字符串文字包含在自定义格式字符串中。例如,“dd.hh\:mm”将句点 (.) 定义为天和小时之间的分隔符,将冒号 (:) 定义为小时和分钟之间的分隔符。
因此,正确的方法是乔恩提到的使用“\”来逃避 阅读更多
您TimeSpan
的是“17:23:24”,它采用 24 小时格式,应该使用HH
格式解析,而不是hh
12 小时格式。
TimeSpan.ParseExact(tmp, "HH:mm:ss",System.Globalization.CultureInfo.InvariantCulture);
查看格式
使用这个它可以使用
TimeSpan.ParseExact(value, “h\\:mm”, CultureInfo.InvariantCulture);
试试这个:
var t2 = TimeSpan.ParseExact(tmp, "HH:mm:ss", System.Globalization.CultureInfo.InvariantCulture);