DateTime.TryParse терпит неудачу только в yyyy

У меня есть поле фильтра, которое позволяет выполнять поиск по частичной или полной дате, которую можно вводить в разных форматах, то есть в зависимости от того, как пользователь хочет ее ввести, поэтому TryParseExact не выглядит лучшим вариантом.

Проблема в том, что следующий код:

DateTime.TryParse(fromDate.Text, CultureInfo.InvariantCulture, DateTimeStyles.None, out dateFromValue)

анализирует все, кроме строк yyyy. Например. "05/1980" и "1980/05" распознаются как {05.01.1980 00:00}, но "1980" не работает.

Я подозреваю, что синтаксический анализатор не может различать, скажем, yyyy и ffff, когда все, что он получает, - это последовательность из 4 цифр, но мне все еще нужно, чтобы это работало. Возможно, есть более элегантный способ сделать это, чем

if(!DateTime.TryParse("1980", CultureInfo.InvariantCulture, DateTimeStyles.None, out date))
    DateTime.TryParseExact("1980","yyyy",CultureInfo.InvariantCulture, DateTimeStyles.None, out date);

или я вообще не так делаю?

Заранее спасибо!


person Darth Veyda    schedule 15.08.2016    source источник


Ответы (2)


Я думаю, вы не можете использовать DateTime.Parse только с годом, потому что месяц и день неоднозначны. Вместо этого работает DateTime.ParseExact или DateTime.TryParseExact с определенным форматом даты.

Однако ваше условие if кажется мне неправильным, как вы сочетаете два условия?

if(!DateTime.TryParse("1980", CultureInfo.InvariantCulture, DateTimeStyles.None, out date))
DateTime.TryParseExact("1980","yyyy",CultureInfo.InvariantCulture, DateTimeStyles.None, out date);

должно было:

if(DateTime.TryParse("1980", CultureInfo.InvariantCulture, DateTimeStyles.None, out date) ||
DateTime.TryParseExact("1980","yyyy",CultureInfo.InvariantCulture, DateTimeStyles.None, out date))
// If the first parse success, use that. Otherwise, try to parse the year only with the parseexact.
// Notice the || and the first condition needs to be positive. 
person kurakura88    schedule 15.08.2016
comment
Хороший момент - я должен быть более осторожным при копировании! Спасибо, что указали на это :) В данном конкретном случае меня бы вполне устроило, если бы TryParse просто угадал пропущенный день и месяц (например, 1 января по умолчанию) - если бы он только мог это сделать :( - person Darth Veyda; 15.08.2016

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

person FloatingKiwi    schedule 15.08.2016
comment
Я думал об этом, но TryParse в основном работает, поэтому попытка заставить его полностью работать выглядит очень заманчиво :) - person Darth Veyda; 15.08.2016