DateTime.TryParse все возможные типы дат - PullRequest
7 голосов
/ 24 февраля 2010

Я хочу проверить правильность формата даты. Существует много возможностей правильных дат, таких как:

  • 02.08.2010
  • 2.8.2010
  • 02.8.2010 02.08
  • 02.August
  • ...

Я могу проверить каждый с помощью кода, подобного этому:

if (DateTime.TryParse(DateTime.ParseExact(date, "dd.M.", 
                              new CultureInfo("sl-SI")).ToString(), out dt))

Но тогда у меня может быть 40 операторов if. Можно ли проверить все даты одним оператором if или одним циклом?

Обновление:

Судя по ответам, я тестирую этот код, но у меня есть еще одна проблема. Что если у меня только 9.2, а не 9.2.2010, тогда этот код не будет работать:

CultureInfo ci = CultureInfo.GetCultureInfo("sl-SI");
string[] fmts = ci.DateTimeFormat.GetAllDateTimePatterns();

if (DateTime.TryParseExact(date, fmts, ci, DateTimeStyles.AssumeLocal, out dt))
{
    DateTime = Convert.ToDateTime(date);
    Check = true;
}

Должен ли я добавить это время вручную или что я могу сделать?

Ответы [ 2 ]

9 голосов
/ 24 февраля 2010

Да ParseExact может принять список форматов для проверки.

var formats = new[] { "M.d.yyyy", "dd.MM.yyyy" };
var dateValue = DateTime.ParseExact(
    dateString, formats, new CultureInfo("sl-SI"), DateTimeStyles.None);
8 голосов
/ 24 февраля 2010

Вы можете использовать что-то вроде следующего, но имейте в виду, что несколько форматов могут анализировать одну и ту же дату. Например, 10/11/12 можно проанализировать как yy / MM / dd или MM / dd / yy, которые являются действительными форматами даты США. MM / dd / yy встречается чаще, поэтому он появляется первым в списке и возвращается кодом, приведенным ниже (если вы используете его с культурой США вместо культуры в примере).

string testValue = "10.11.12";

DateTime result;
CultureInfo ci = CultureInfo.GetCultureInfo("sl-SI");
string[] fmts = ci.DateTimeFormat.GetAllDateTimePatterns();
Console.WriteLine(String.Join("\r\n", fmts));
if (DateTime.TryParseExact(testValue, fmts, ci,
   DateTimeStyles.AssumeLocal, out result))
{
   Console.WriteLine(result.ToLongDateString());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...