Parse exact custom time format?

前端 未结 2 2072
小鲜肉
小鲜肉 2020-12-22 00:37

I can\'t seem to get the custom format right for my TimeSpan.ParseExact():

Time samples to be expected:

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


        
相关标签:
2条回答
  • 2020-12-22 01:09

    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.)

    0 讨论(0)
  • 2020-12-22 01:34

    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

    0 讨论(0)
提交回复
热议问题