Как проверить, что дата действительна с 3 целыми числами?(Метод возврата bool) - PullRequest
0 голосов
/ 10 апреля 2019

Я пытаюсь создать метод, который проверяет, правильно ли введены день, месяц и год.Метод возвращает значение ИСТИНА, если дата в порядке, и ЛОЖЬ, если дата НЕ в порядке. Проблема: код всегда возвращает ложь.

const int max_year = 2100;
const int min_year = 1900;

static bool CheckDate(int d, int m, int y)   
{
    if (d < 1 || d > 31)
    {
        if (m < 1 || m > 12)
        {
            if (y < min_year || y > max_year)
            {
                return false;
            }
            else
            {
                return true;
            }
        }
        else
        {
            return true;
        }
    }
    else
    {
        return true;
    }
}

А потом я проверяю дату в свойстве как:

public int Day
{
    get
    {
        return day;
    }
    set
    {
        if (CheckDate(dan, mesec, year) == true)
        {
            day = value;
        }
        else
        {
            throw new Exception("Day is incorrect!");
        }
    }
}

Ответы [ 3 ]

2 голосов
/ 10 апреля 2019

Как можно проще, просто преобразуйте свои числа в строку, а затем выполните DateTime.TryParseExact в формате yyyyMMdd

bool CheckDate(int y, int m, int d)
{

    string t = $"{y:D4}{m:D2}{d:D2}";
    return DateTime.TryParseExact(t, "yyyyMMdd", CultureInfo.InvariantCulture,DateTimeStyles.None,  out DateTime dt);
}

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

if (y < min_year || y > max_year)
    return false;
....
1 голос
/ 10 апреля 2019

Я хочу указать на возможную ошибку и / или неправильный дизайн в вашем установщике свойств (это может быть причиной того, что ваш код " всегда возвращает false ").

Если вы посмотрите внимательно, вы увидите, что CheckDate всегда вызывается с параметрами dan, mesec и year. Как вы знаете, value - это значение, которое нужно установить (Day = 1, или Day = 500), но оно не является частью CheckDate -call.

Если это ваша цель, я могу сказать, что это очень плохой дизайн. Вы должны вызывать CheckDate прямо в своем коде, а не с присваивающим почти побочные эффекты установщиком свойств .

public int Day
{
    get
    {
        return day;
    }
    set
    {
        // Why this?
        if (CheckDate(dan, mesec, year) == true)
        {
            day = value;
        }
        else
        {
            throw new Exception("Day is incorrect!");
        }
    }
}
0 голосов
/ 10 апреля 2019

Или вы можете сделать это:

static bool CheckDate(int d, int m, int y) 
{
   try
   {
      // This will throw an exception if the year, month or day are invalid
      var temp = new DateTime(y, m, d);
      return true;
   }
   except
   {
     return false;
   }
}
...