Opérateurs And & Or dans if

J'ai fait un programme de date de naissance qui affiche votre DoB, il prendra aussi en compte les années bissextiles de sorte que si vous entrez l'année 1995, le mois 2, le jour 29, il y aura une erreur car ce n'était pas une année bissextile. Cela prend également combien de jours chaque mois a et c'est cette partie que je veux aider. Actuellement, voici comment c'est:

           if (month == 1/&& day > 31)
            {
                Console.WriteLine("January only has 31 days - Enter again");
                validDay = false;
            }
            else if (day >= 29 && !IsLeapYear(year) && month == 2)
            {
                Console.WriteLine("You were not born on a leap year or February only has 28 days - Enter again");
                validDay = false;
            }
           //And so on for each month

Alors j'ai alors essayé comme ça:

if (month == 1 || month == 3 || month == 5 || month == 7 || 
                month == 8 || month == 10 || month == 12 && day > 31)
            {
                Console.WriteLine("Your birth month only has 31 days - Enter again");
                validDay = false;
            }
            else if (day >= 29 && !IsLeapYear(year) && month == 2)
            {
                Console.WriteLine("You were not born on a leap year or February only has 28 days - Enter again");
                validDay = false;
            }
            else if (month == 3 || month == 6 || month == 9 || month == 11 && day > 30)
            {
                Console.WriteLine("Your birth month only has 30 days - Enter again");
                validDay = false;
            }

And for some reason it will always throw the error message even if you enter 1997, 5, 28. The month chosen in 5 but the day is not > 31 so why does it do this? I'm also open up to different ways to do this because I have a feeling there's another way - arrays maybe?

2
ajouté édité
Vues: 1
Merci les gars, en utilisant des parenthèses a résolu le problème. Je l'ai changé pour utiliser l'heure de la date aussi, mais je pensais que l'utilisation de ce genre de prendre le plaisir du programme de fabrication. Toujours pris deux nouvelles choses de toute façon, alors merci encore :)
ajouté l'auteur Dan Scott, source
Cela fonctionne: Cela fonctionne: public static bool IsLeapYear (int année) {if (année% 4 == 0 || année% 100 == 0 && année% 400 == 0) return true; sinon, retournez faux; }
ajouté l'auteur Dan Scott, source
Traitez-vous correctement les années bissextiles du siècle? Il existe un DateTime.DaysInMonth méthode qui va faire disparaître ce bloc de code laid (et résoudre les bogues cachés dedans).
ajouté l'auteur 48klocs, source
Parce que votre AND est seulement appliqué au dernier OR .
ajouté l'auteur Ally, source

4 Réponses

Je vous recommande d'utiliser DateTime.TryParse - il validera automatiquement toutes les dates, alors vous pouvez simplement retourner quelque chose comme "Date invalide" à l'utilisateur.

1
ajouté

Je recommanderais d'utiliser DateTime.TryParseExact comme suit ...

string year = "1997";
string month = "5";
string day = "28";
string dateText = string.Format("{0}/{1}/{3}", year, month, day);
DateTime date;

if (!DateTime.TryParseExact(dateText, "yyyy/MM/dd", null, DateTimeStyles.None, out date))
{
    Console.WriteLine("Date is invalid");
}

Bonne chance!

0
ajouté

Les opérateurs ont quelque chose appelé ordre de priorité . Essayez d'utiliser des parenthèses afin d'atteindre la priorité que vous souhaitez atteindre.

0
ajouté

Pourquoi ne pas utiliser DateTime.TryParse.

S'il vous plaît jeter un oeil sur les liens suivants:

Date de validation (année bissextile ou non) avant l'insertion dans la base de données

Valider un DateTime en C#

0
ajouté