Как проверить действительную дату в формате ггггММ - PullRequest
4 голосов
/ 01 сентября 2010

У меня есть внутренний бизнес-процесс, которым управляет мой финансовый отдел.Чтобы начать, они вводят дату в формате yyyyMM или 201009.Я хочу проверить правильность даты в этой строке, но пока ничего не получил.

В настоящее время я изучаю возможность разбить строку, взять первые 4 и проверить, что они между 1990 и 2050 (например).а затем последние 2 и проверка, что это между 01 и 12.

Есть ли лучший способ?

Ответы [ 5 ]

14 голосов
/ 01 сентября 2010

Вы можете использовать DateTime.TryParseExact, чтобы увидеть, можно ли его правильно проанализировать:

bool isValid = false;
DateTime dateValue;
if(DateTime.TryParseExact("201009", "yyyyMM", CultureInfo.InvariantCulture, 
                       DateTimeStyles.None, out dateValue))
{
   // DateTime parsed, dateValue contains the parsed DateTime

   // Can validate dateValue against business rules at this point
   isValid = (dateValue <= DateTime.Now && dateValue >= DateTime.Now.AddYears(-5));
}

Если вы хотите получить исключение, вы можете использовать DateTime.ParseExact:

// Next line throws exception if format not correct
DateTime.ParseExact("201009", "yyyyMM", CultureInfo.InvariantCulture);
4 голосов
/ 01 сентября 2010

Вы можете использовать регулярное выражение:

if (Regex.IsMatch(input, @"^(199\d|20[0-5]\d)(0[1-9]|1[0-2])$")) {
  // valid input between 199001 and 205912
}
1 голос
/ 01 сентября 2010

Я бы пошел с DateTime.ParseExact:

DateTime d = DateTime.ParseExact("201009", "yyyyMM", System.Globalization.CultureInfo.InvariantCulture);
0 голосов
/ 01 сентября 2010

Я бы соблазнился выполнить это как проблему диапазона чисел:

UInt32 val;
if (input.Length != 6
   || !UInt32.TryParse(input, out val)
   || val > 205012
   || val < 199001
   || val % 100 > 12
   || val % 100 == 0) {
  // Invalid...
}
0 голосов
/ 01 сентября 2010

Проблема здесь в том, что формат "ггггММ" не может представлять конкретный DateTime. Поэтому методы синтаксического анализа, встроенные в DateTime, не принесут вам пользы.

Обновление : Неважно; Я стою исправлено. DateTime.TryParseExact будет работать нормально (иронично, если вы спросите меня); он будет интерпретировать вашу строку как первый день данного месяца.

Я бы сделал то, что вы описываете: анализ строки в двух числовых компонентах и ​​просто сравнил бы эти значения с любым диапазоном, в который вы хотите их поместить.

...