DateTime.ParseExact завершается ошибкой в ​​зависимости от длины анализируемой строки - PullRequest
1 голос
/ 14 апреля 2010

Это очень странно. У меня есть следующий код:

Assert.AreEqual(new DateTime(2000, 1, 1), DateTime.ParseExact("2000", "yyyy", CultureInfo.InvariantCulture));
Assert.AreEqual(new DateTime(2000, 1, 1), DateTime.ParseExact("20000705", "yyyy", CultureInfo.InvariantCulture));

Первая строка проходит, вторая - "System.FormatException: String was not recognized as a valid DateTime".

Я не могу сократить анализируемую строку, чтобы она соответствовала длине формата - это будет работать в данном конкретном случае, но это часть более общего метода, и он потерпит неудачу где-то еще. Любая идея о том, почему второй вызов не удается?

[Редактировать] Хорошо, я надеялся, что он анализирует столько входной строки, сколько необходимо для удовлетворения формата.

Я получаю много строк во многих форматах, и у меня есть один метод, который принимает оба и после небольшой обработки (я получаю только даты, поэтому я заменяю «m» на «M» и «Y») с "у" и т. д.), я звоню DateTime.ParseExact. Причина, по которой я не могу вызвать DateTime.Parse, заключается в том, что он не допускает аргумент форматирования ... Я могу получить ddMMyyyy в одной части программы и yyyyddMM в другой, для него нет способа правильно понять это.

[Редактировать 2] Я полагаю, это моя вина ... Мне придется усечь ввод, когда возникнет эта проблема. К счастью, у меня вообще есть все части даты в формате, это (только год) редкий случай. Спасибо за помощь.

Ответы [ 3 ]

2 голосов
/ 14 апреля 2010

Совершенно верно провалиться - вы сказали, что ожидаете ровно 4 символа, а затем дали 8!

Опции:

  • Предоставить больше строк формата (например, "yyyyMMdd") для вызова (вы можете указать несколько допустимых форматов)
  • передать только тот фрагмент строки, который вы ожидаете, чтобы соответствовать формату
  • Разобрать строку самостоятельно

Вы утверждаете, что усечение строки "потерпит неудачу где-нибудь еще" - не могли бы вы дать более подробную информацию? Если вы указываете «гггг», то, вероятно, вы знаете, что вам нужно ровно 4 символа ... вы точно знаете, где они будут в строке? Если так, почему вы не можете выполнить усечение?

1 голос
/ 14 апреля 2010

Не удалось, потому что DateTime.ParseExact требует, чтобы входная строка соответствовала указанному формату точно (ошибаюсь, я имею в виду почти точно , согласно вашему комментарию ниже) и "20000705" не соответствует "гггг".

Для синтаксического анализа "20000705" вам необходимо использовать другой метод - либо ParseExact с соответствующей строкой формата (например, "yyyyMMdd"), либо DateTime.Parse, что немного более прощающий (хотя и менее точный).

Похоже, вы пытаетесь извлечь год из строки даты - никакой метод синтаксического анализа не сделает это за вас.

Вместо этого вы должны получить фактический DateTime, представленный строкой - 5 июля 2000 г. или 7 мая 2000 г., в зависимости от вашего формата - и затем извлечь год, используя DateTime.Year.

0 голосов
/ 14 апреля 2010

Самая высокая дата, которую может представлять DateTime, - 31 декабря 9999. Вы просите его понимать год, превышающий 9999. Вам нужно либо указать формат, соответствующий значению, которое вы ему даете, чтобы он понимал, что только первые 4 цифры - это год. "ггггммдд", например.

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