Почему 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.
Ответы
Ответ 1
В документации :
Любой другой неэкранированный символ в строке формата, включая белый пробел, интерпретируется как спецификатор пользовательского формата. В в большинстве случаев наличие любого другого неэкранированного символа приводит к FormatException.
Есть два способа включить буквенный символ в строку формата:
-
Заключить его в одинарные кавычки (литеральный разделитель строк).
-
Предварите его с помощью обратного слэша ( "\" ), который интерпретируется как escape-символ. Это означает, что в С# строка формата должна либо быть @-отображенным, либо буквальный символ должен предшествовать дополнительная обратная косая черта.
.NET Framework не определяет грамматику для разделителей во времени интервалы. Это означает, что разделители между днями и часами, часы и минуты, минуты и секунды, секунды и доли во-вторых, все должны рассматриваться как символьные литералы в строке формата.
Итак, решение состоит в том, чтобы указать строку формата как
TimeSpan.ParseExact(tmp, "hh\\:mm\\:ss", CultureInfo.InvariantCulture)
Ответ 2
Попробуйте следующее:
var t2 = TimeSpan.ParseExact(tmp, "c", System.Globalization.CultureInfo.InvariantCulture);
Источник:
Стандартные строки формата TimeSpan
Ответ 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);