Как проверить значение DateTime? - PullRequest
0 голосов
/ 04 января 2019

Я прошу две даты, которые должны быть в формате (дд-мм-гггг). Мне нужно разрешить пользователю вводить только правильную дату, такую ​​как формат, и год должен быть только 2018. Как я могу это сделать? Заранее спасибо.

Я пытался поместить их в цикл while примерно так.

while (!DateTime.TryParse(Console.ReadLine(), out firstDate))
        {

            Console.WriteLine("Invalid date. Format must be (dd-MM-yyyy)");
            Console.Write("Arrival date: ");
            dateFrom = Console.ReadLine();


        }

Проблема в том, что я получаю сообщение об ошибке firstDate, и если я изменяю ее с int на DateTime, то ParseExact не работает, и мне нужен простой формат даты.

String firstDate; //stores the start date
        String secondDate; //stores the end date

Console.Write("Please enter the first date (dd-MM-yyyy):");
        firstDate= Console.ReadLine();

Console.Write("Please enter the second date (dd-MM-yyyy):");
        secondDate= Console.ReadLine();

DateTime dateOne = DateTime.ParseExact(firstDate, "dd-MM-yyyy", 
System.Globalization.CultureInfo.InvariantCulture); 

         DateTime dateTwo= DateTime.ParseExact(secondDate, "dd-MM-yyyy", 
System.Globalization.CultureInfo.InvariantCulture);

Ответы [ 3 ]

0 голосов
/ 04 января 2019

Я думаю, что вы правильно анализируете дату, вам просто нужен код, чтобы задать ее n раз, если пользователь не введет правильную дату.

DateTime firstDate;
bool dateConverted= false;

do{
   var dateString = Console.ReadLine();
   dateConverted= DateTime.TryParseExact(dateString , "dd-MM-YYYY", System.Globalization.CultureInfo.InvariantCulture, out firstDate);

   if(!dateConverted)
     Console.WriteLine("Invalid date");
}
while(!dateConverted)
0 голосов
/ 04 января 2019

При получении ввода от пользователя в приложении Console я создаю библиотеку методов, которые принимают строку promp (для представления пользователю), а затем проверяют результаты в цикле. Это значительно упрощает получение данных от пользователя, который должен быть определенного типа и / или должен иметь определенный диапазон значений, например.

В этом случае нам нужно получить DateTime от пользователя, и он должен быть в определенном формате. Чтобы справиться с этим, я бы создал следующие методы:

private static DateTime GetDateWithFormatFromUser(string prompt, 
    List<string> validFormats = null)
{
    // If the user doesn't pass any valid formats, then use a generic method to get the value
    if (validFormats == null || validFormats.Count == 0) return GetDateFromUser(prompt);

    DateTime result;

    // Prompt the user in a loop, where the condition is
    // that the value they enter is in one of our formats.
    do
    {
        Console.Write(prompt);
    } while (!DateTime.TryParseExact(Console.ReadLine(), validFormats.ToArray(),
        CultureInfo.InvariantCulture, DateTimeStyles.None, out result));

    return result;
}

private static DateTime GetDateFromUser(string prompt)
{
    DateTime result;

    do
    {
        Console.Write(prompt);
    } while (!DateTime.TryParse(Console.ReadLine(), out result));

    return result;
}

Теперь в нашем основном коде мы можем создать список форматов, которые мы примем (возможно, мы допустим однозначные И двухзначные дни и месяцы), а затем передадим его в наш метод проверки выше вместе с подскажите:

static void Main()
{
    var validFormats = new List<string>
    {
        "dd-MM-yyyy", "d-MM-yyyy", "dd-M-yyyy", "d-M-yyyy"
    };

    DateTime firstDate = GetDateWithFormatFromUser(
        "Please enter the first date (dd-MM-yyyy): ", validFormats);

    DateTime secondDate = GetDateWithFormatFromUser(
        "Please enter the first date (dd-MM-yyyy): ", validFormats);

    GetKeyFromUser("Done! Press any key to exit...");
}
0 голосов
/ 04 января 2019

Одна из причин сбоя ParseExact состоит в том, что день / месяц состоит из одной цифры. Так что лучше попробуй

DateTime dateOne = DateTime.ParseExact(firstDate, "d-M-yyyy", 
System.Globalization.CultureInfo.InvariantCulture); 

Это будет гарантировать, что он принимает одно и двухзначные цифры для дня и месяца

Затем вы можете проверить, является ли год 2018 с помощью свойства DateTime.Year

dateOne.Year

Обновление

На основании вашего комментария, чтобы проверить правильность даты.

if(!DateTime.TryParseExact(firstDate, "d-M-yyyy",
                           CultureInfo.InvariantCulture,
                           DateTimeStyles.None,
                           out var dateOne))
{
Console.WriteLine("Not Valid Format");
}

Вы также можете проверить, является ли год 2018 в том же заявлении.

if(!DateTime.TryParseExact(firstDate, "d-M-yyyy",
                           CultureInfo.InvariantCulture,
                           DateTimeStyles.None,
                           out var dateOne) || (dateOne.Year != 2018))
{
Console.WriteLine("Not Valid Format");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...