2010-11-16 3 views
6

Я пытаюсь разобрать следующий String в DateTime объекта в C#:DateTime.ParseExact не работает вообще, почему?

DateTime.ParseExact("20101108 230125", "yyyyMMdd hhmmss", null) 

хотя значение выглядит правильно метод ParseExact просто продолжает давать мне следующее:

Строка не была признана действительный DateTime.

Может ли кто-нибудь сказать мне, почему и как я могу разобрать вышеуказанную строку, не делая это вручную? Разве не ParseExact должен быть для такого случая?

ответ

21

Вы получили формат часов неправильными, должны быть в верхнем регистре:

DateTime.ParseExact("20101108 230125","yyyyMMdd HHmmss", null) 

Строчные hh указывает, что время использует 12-часовой (с AM/PM). Верхний регистр HH - это 24-часовое время.

Для получения подробной информации, пожалуйста, проверьте documentation of custom DateTime format strings.

+0

Почему это вызывает исключение? Лично я ожидал бы, что hh конвертирует 23 в 11, а не бросает исключение. Вызывает ли это ParseExact? –

+1

@Marcus: 'ParseExact' будет делать то, что он говорит; проанализируйте строку с использованием указанного * точного * формата. Поскольку 'hh' говорит ему ожидать 12-часовое значение времени в этой позиции,' 23' явно выходит за пределы допустимых значений. Он анализирует точную строку, никаких преобразований не производится. Так что да, исключение выбрано методом 'ParseExact'. –

+0

Приветствия за расширенное объяснение. :) –

2

Попробуйте использовать:

var dt = DateTime.ParseExact("20101108 230125", "yyyyMMdd HHmmss", null) 

"чч" для 12 часов времени и "НН" в течение 24 часов.

+0

Ой, что только что увидел ответ Фредрика ... –