Подтвердить что ты не робот

Почему TimeSpan.ParseExact не работает

Это немного странно. Если я попытаюсь быть точным, анализ текстового поля с допустимым интервалом времени невозможен.

const string tmp = "17:23:24";
//works
var t1 = TimeSpan.Parse(tmp);
//fails
var t2 = TimeSpan.ParseExact(tmp, "hh:mm:ss", System.Globalization.CultureInfo.InvariantCulture);

Второй синтаксический анализ завершился с ошибкой. "Строка ввода не была в правильном формате". из DateTime.

4b9b3361

Ответ 1

В документации :

Любой другой неэкранированный символ в строке формата, включая белый пробел, интерпретируется как спецификатор пользовательского формата. В в большинстве случаев наличие любого другого неэкранированного символа приводит к FormatException.

Есть два способа включить буквенный символ в строку формата:

  • Заключить его в одинарные кавычки (литеральный разделитель строк).

  • Предварите его с помощью обратного слэша ( "\" ), который интерпретируется как escape-символ. Это означает, что в С# строка формата должна либо быть @-отображенным, либо буквальный символ должен предшествовать дополнительная обратная косая черта.

.NET Framework не определяет грамматику для разделителей во времени интервалы. Это означает, что разделители между днями и часами, часы и минуты, минуты и секунды, секунды и доли во-вторых, все должны рассматриваться как символьные литералы в строке формата.

Итак, решение состоит в том, чтобы указать строку формата как

TimeSpan.ParseExact(tmp, "hh\\:mm\\:ss", CultureInfo.InvariantCulture)

Ответ 3

Кажется, что HH на самом деле не для TimeSpan

Пользовательские спецификации формата TimeSpan не включают в себя placeholder разделительные символы, такие как символы, которые отделяют дни от часов, часов от минут или секунд от дробных секунд. Вместо этого эти символы должны быть включены в строку пользовательского формата в виде строки литералы. Например, "dd.hh \: mm" определяет период (.) Как разделитель между днями и часами и двоеточие (:) как разделитель между часами и минутами.

Следовательно, правильный путь был бы таким, как сказал Джон, чтобы убежать с помощью "\" Подробнее

Ваш TimeSpan "17:23:24" , который находится в 24-часовом формате, и он должен быть проанализирован с использованием формата HH, а не HH, который предназначен для 12-часовых форматов.

TimeSpan.ParseExact(tmp, "HH:mm:ss",System.Globalization.CultureInfo.InvariantCulture);

Отметьте форматы Забастовкa >

Ответ 4

Если вы не хотите иметь дело с разницей в спецификаторах формата между TimeSpan.ParseExact и DateTime.ParseExact, вы можете просто проанализировать свою строку как DateTime и получить компонент TimeOfDay как TimeSpan, как этот

var t2 = DateTime.ParseExact(tmp, "hh:mm:ss", CultureInfo.InvariantCulture).TimeOfDay;

Ответ 5

Попробуйте следующее:

     var t2 = TimeSpan.ParseExact(tmp, "HH:mm:ss", System.Globalization.CultureInfo.InvariantCulture);