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

时间:2013-11-21 14:34:42

标签: c# timespan

我似乎无法为我的TimeSpan.ParseExact()获取自定义格式:

预期的时间样本:

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

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

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

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

2 个答案:

答案 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();

Demonstration