У меня есть следующая строка «12-5», и я пытаюсь разобрать ее с помощью TryParse в. NET. Вернул true, Как получить false для данной строки? - PullRequest
0 голосов
/ 02 марта 2020

При указании "12-5" или "12,5" в качестве входных данных для DateTime.TryParse in. NET, оно преобразуется в " 12-05-2020 " и возвращаемое значение true . Как "12-5" равен "12-05-2020"? В моем случае входная строка является датой рождения пользователя, и это свободный текст согласно требованию, и проанализированное значение «12-05-2020» не имеет смысла, поскольку дата рождения не может быть будущей датой. Есть ли способ исправить это без использования DateTime.Parse или DateTime.ParseExact, поскольку они могут генерировать исключения.

Ответы [ 2 ]

1 голос
/ 02 марта 2020

Что ж, у вас есть 2 тестов для выполнения:

  1. Для правильной даты синтаксис (скажем, bla-bla-bla не один)
  2. Для действительной даты значение (скажем, 25-03-2123 не одно)

Давайте проверим эти требования в одном if:

   string userInput = "12-05-15"; // 12 May 2015

   ...

   // We can use several formats in one go:
   // DateTime.TryParseExact will try formats in the given order
   string[] allowedFormats = new string[] {
     "d-M-yy", "d-M-yyyy", "MMM d yyyy",
   };

   if (DateTime.TryParseExact(
          userInput.Trim(), // let's tolerate leading/trailing whitespaces
          allowedFormats,        
          CultureInfo.InvariantCulture, 
          System.Globalization.DateTimeStyles.None, 
          out var result) && 
       result <= DateTime.Today &&
       result >= DateTime.Today.AddYears(-150)) {
     // result is 
     //   1. Valid date 
     //   2. At least 150 years ago
     //   3. At most today 
   }
   else {
     // userInput doesn't meet at least one criterium
   } 
0 голосов
/ 02 марта 2020

Как предложил @Rafalon, используйте DateTime.TryParseExact, чтобы избежать исключений и установить нужный формат.

string dateformat = "12-05";
bool answer = DateTime.TryParseExact(dateformat, "dd-MM-yyyy", CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out DateTime result);
...