DateTime.ParseExact с использованием формата только час не работает - PullRequest
0 голосов
/ 16 мая 2018

В моем сетевом базовом проекте мне нужно проанализировать строку в DateTime. Формат динамический и не известен во время компиляции. Код:

var datetime = DateTime.ParseExact(data, format, CultureInfo.InvariantCulture, DateTimeStyles.None);

но у меня возникают проблемы, когда формат - это просто час, и он приходит в виде чисел от 0 до 23. Согласно этой статье для указания формата часа у вас есть 4 варианта: h , чч , Ч и ЧЧ , но при попытке анализа "0"

Используя ч Я получаю:

System.FormatException: входная строка была в неправильном формате.

Используя чч Я получаю:

System.FormatException: строка не была распознана как допустимый DateTime.

Используя H Я получаю:

System.FormatException: входная строка была в неправильном формате.

Используя ЧЧ Я получаю:

System.FormatException: строка не была распознана как допустимый DateTime.

В этой статье говорится, что

Если формат является шаблоном нестандартного формата, который не включает дату или разделители времени (такие как «ггггММДЧЧмм»), используйте инвариантную культуру для параметра провайдера и самой широкой формы каждого пользовательского формата спецификатор. Например, если вы хотите указать часы в формате шаблон, укажите более широкую форму, "HH", вместо более узкой формы, "H".

но это то, что я делал и не работал. Я не могу догадаться, как добиться анализа строки, которая занимает всего час в DateTime. Есть идеи ??

EDIT

Исключение выдается при выполнении любой из следующих строк:

DateTime.ParseExact("0", "HH", CultureInfo.InvariantCulture, DateTimeStyles.None);
DateTime.ParseExact("0", "H", CultureInfo.InvariantCulture, DateTimeStyles.None);

Я не могу использовать TimeSpan.Parse, поскольку у меня есть универсальное решение для чтения файлов xlsx . Как читать файл хранится в базе данных. Иногда DateTime все в одном столбце, и формат ddMMyyHHmmss, а другие DateTime в одном столбце с форматом ddMMyy и час в другом как число от 0 до 23 (минуты и секунды должны быть инициализированы с 0 ). Позже дата и час объединяются, чтобы вернуть весь DateTime.

1 Ответ

0 голосов
/ 17 мая 2018

При предоставлении в качестве формата только одного символа он будет интерпретироваться как стандартный спецификатор формата , а не пользовательский спецификатор формата .Символ % может использоваться для принудительной обработки его как пользовательского спецификатора.Это описано в документации здесь .

Таким образом, вместо передачи "h", передайте "%h".Вместо "H", передайте "%H"

Другие ответы, такие как этот , упоминали об этом в отношении форматирования с использованием String.Format или ToString, но такжеприменимо для ParseExact.

В качестве альтернативы вы можете найти свой код более разборчивым и производительным, если вместо этого начнете с некоторого известного значения DateTime (возможно, DateTime.MinValue или, возможно, чего-то еще), а затем используйте * 1029.* чтобы получить желаемый результат.(Конечно, вы сначала разберете строку в целое число.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...