1
votes

Comment valider une valeur DateTime?

Je demande que deux dates soient toutes deux au format (jj-MM-aaaa). Je dois laisser l'utilisateur entrer uniquement une date valide comme le format et l'année doit être 2018 uniquement. Comment puis-je faire ceci? Merci d'avance.

J'ai essayé de les mettre dans une boucle while quelque chose comme ça.

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);

Le problème est que j'obtiens une erreur sur firstDate et si je change de int à DateTime, le ParseExact ne fonctionne pas et j'ai besoin du format de date simple.

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

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


        }


1 commentaires

quelle a été votre contribution?


3 Réponses :


1
votes

Une des raisons pour lesquelles ParseExact peut échouer est lorsque le jour / mois est à un chiffre. Il est donc préférable d'essayer

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

Cela garantirait qu'il accepte les chiffres simples et doubles pour le jour et le mois

Vous pouvez ensuite vérifier si l'année est 2018 avec DateTime.Year Propriété

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

Mise à jour

En fonction de votre commentaire, pour vérifier si la date est valide.

dateOne.Year

Vous pouvez également vérifier si l'année est 2018 dans le même relevé.

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


6 commentaires

mais disons que l'utilisateur essaie de saisir un mot ou une date invalide Je veux que le programme lui demande de saisir une date correcte


Vous pouvez utiliser DateTime.TryParseExact.


J'ai mis à jour la réponse avec un exemple de DateTime.TryParseExact. Veuillez vérifier si c'est ainsi que vous l'aimez.


Merci, je vais le vérifier dans environ une heure et vous mettre à jour. Merci beaucoup pour la contribution


hé je reçois des erreurs sur CultureInfo et DateTimeStyles (elles n'existent pas dans le contexte actuel


Vous devez ajouter une référence à l'espace de noms System.Globalization



0
votes

Je pense que vous analysez correctement la date, vous avez juste besoin d'un peu de code pour lui demander n nombre de fois à moins que l'utilisateur n'entre la date correcte.

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)


1 commentaires

J'essaierai bientôt. Merci beaucoup!



0
votes

Lorsque je reçois des informations de l'utilisateur dans une application Console , je crée une bibliothèque de méthodes qui prennent une chaîne promp (à présenter à l'utilisateur), puis je valide les résultats dans une boucle. Cela rend beaucoup plus facile d'obtenir des données de l'utilisateur qui doivent être d'un type spécifique et / ou doivent être dans une plage de valeurs spécifique, ect.

Dans ce cas, nous devons obtenir un DateHeure code> de l'utilisateur, et il doit être dans un format spécifique. Pour gérer cela, je créerais les méthodes suivantes:

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...");
}

Maintenant, dans notre code principal, nous pouvons créer une liste de formats que nous accepterons (peut-être autoriserons-nous jours et mois à un chiffre ET à deux chiffres), puis transmettez-le à notre méthode de validation ci-dessus avec l'invite:

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;
}


2 commentaires

Cela semble assez compliqué, je vais l'essayer merci pour votre contribution


Pas trop compliqué ... c'est simplement une boucle do , où la condition utilise DateTime.TryParseExact pour valider l'entrée en utilisant les chaînes de format spécifiées.