Parse exact custom time format?

时间秒杀一切 提交于 2019-11-29 16:27:21

I'm not aware of the ability to specify optional parts like that in a custom format string. I suggest you use multiple format strings, and use the overload of TimeSpan.ParseExact that takes an array of formats.

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);
}

(I'm using FFF as the milliseconds specifier to allow you to express "1:23:45.67" as well. If you only ever want hundreds of milliseconds, F or f would be fine.)

I would simply use DateTime.ParseExact instead because it's more powerful:

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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!