解析确切的自定义时间格式?

我似乎无法获得适合我的TimeSpan.ParseExact()的自定义格式:

时间样本预期:

 1:23:45.6 23:45.6 23:45 1:23:45 

我正在使用的字符串格式:

 string withTenthFormat = @"[%h\:]mm\:ss[\.%f]"; 

试着有时间和几分之一秒。 但是,使用此格式和CultureInfo.InvariantCulture会导致FormatException 。 我错过了什么?

我不知道能够在自定义格式字符串中指定类似的可选部分。 我建议你使用多个格式字符串,并使用TimeSpan.ParseExact的重载,它采用一系列格式。

 string[] formats = { @"h\:mm\:ss\.FFF", @"mm\:ss\.FFF", @"h\:mm\:ss", @"mm\:ss"}; string[] values = { "1:23:45.6", "23:45.6", "23:45", "1:23:45" }; foreach (string value in values) { var parsed = TimeSpan.ParseExact(value, formats, CultureInfo.InvariantCulture); Console.WriteLine(parsed); } 

(我使用FFF作为毫秒说明符,允许你表达“1:23:45.67”。如果你只需要几百毫秒, Ff就可以了。)

我只是简单地使用DateTime.ParseExact因为它更强大:

 string[] strings = new[] { "1:23:45.6", "23:45.6", "23:45", "1:23:45" }; string[] formats = new[] { "H:mm:ss.f", "H:mm.f", "H:mm", "H:mm:ss" }; TimeSpan[] timespans = strings .Select(str => { TimeSpan? ts = null; DateTime dt; if (DateTime.TryParseExact(str, formats, CultureInfo.InvariantCulture, DateTimeStyles.None, out dt)) ts = dt.TimeOfDay; return ts; }) .Where(ts => ts.HasValue) .Select(ts => ts.Value) .ToArray(); 

示范