我似乎无法为我的TimeSpan.ParseExact()
获取自定义格式:
预期的时间样本:
1:23:45.6
23:45.6
23:45
1:23:45
我正在使用的字符串格式:
string withTenthFormat = @"[%h\:]mm\:ss[\.%f]";
尝试有时间和几分之一秒。但是,使用此格式和CultureInfo.InvariantCulture
会产生FormatException
。我错过了什么?
答案 0 :(得分:8)
我不知道能够在自定义格式字符串中指定类似的可选部分。我建议你使用多个格式字符串,并使用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”。如果你只曾想要几百毫秒,{{ 1}}或F
没问题。)
答案 1 :(得分:1)
我会简单地使用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();