Разбирать точный формат времени?

c# timespan

672 просмотра

2 ответа

Кажется, я не могу получить правильный формат для моего TimeSpan.ParseExact():

Ожидаемые образцы времени:

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

Формат строки, который я использую:

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

Попытка иметь часы и доли секунд опционально. Однако использование этого формата и CultureInfo.InvariantCultureприводит к FormatException. Чего мне не хватает?

Автор: rdoubleui Источник Размещён: 12.11.2019 09:39

Ответы (2)


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». Если вам когда-нибудь понадобятся сотни миллисекунд, Fили fвсе будет хорошо.)

Автор: Jon Skeet Размещён: 21.11.2013 02:37

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

Автор: Tim Schmelter Размещён: 21.11.2013 02:44
Вопросы из категории :
32x32