Question

Existe-t-il une forme analogue du code suivant:

if(month == 4,6,9,11)
{
  do something;
}

Ou doit-il être:

if(month == 4 || month == 6 etc...)
{
  do something;
}

J'essaie d'écrire une instruction if qui vérifie si ce mois a plus de 31 jours.

MODIFIER

Je suppose que le vrai problème, c’est que je comprenne une partie de ce que j’ai appris, mais chaque fois que j’essaie d’utiliser le site Web de Sun sur java, cela m’embrouille. Ma question est la suivante: si je reçois un mois d'utilisateur et un jour et que je le mets dans un format MM / jj et l'évalue, puis-il plus facile de vérifier si le mois et le jour sont valides et après le vérifier? étant valide je peux soit imprimer le MM / JJ dans le format que j'ai. S'il n'est pas valide, imprimez une ligne indiquant le mois ou le jour non valide.

Était-ce utile?

La solution

Si vous utilisez C ou Java, vous pouvez le faire:

switch (month) {
  case 4:
  case 6:
  case 9:
  case 11:
    do something;
    break;
}

Dans certaines langues, vous pourriez même écrire le cas 4,6,9,11: . Une autre possibilité serait de créer un tableau [4,6,9,11], certains langages fonctionnels devraient permettre quelque chose comme si mois dans [4,6,9,11] fait quelque chose;

Comme Lior l’a dit, cela dépend de la langue.

EDIT: À propos, vous pouvez aussi le faire (juste pour le plaisir, un code incorrect car non lisible):

if ((abs(month-5) == 1) || (abs(month-10) == 1)) do_something;

Autres conseils

if( 0x0A50 & (1<<month) != 0 )

mec, c'est ridicule. (mois == 4 || mois == 6 || mois == 9 || mois == 11) est parfaitement correct.

Vous ne spécifiez pas le langage, mais si vous utilisez Java, alors oui, vous devez le faire de la deuxième façon ou utiliser le commutateur:

switch(month) {
  case 4:
  case 6:
  case 9:
  case 11:
    do something;
}

Vous pouvez également trouver utile et plus propre (selon la conception) de ne pas coder en dur les valeurs mais de les conserver ailleurs:

private static final Collection<Integer> MONTHS_TO_RUN_REPORT = Arrays.asList(4, 6, 9, 11);
....
if (MONTHS_TO_RUN_REPORT.contains(month)) {
  do something;
}   

Ce mois-ci

System.out.println("This month has " + new GregorianCalendar().getActualMaximum(Calendar.DAY_OF_MONTH) + " days in it.");

Si instruction pour vérifier s'il y a 31 jours ce mois-ci

if (31 == new GregorianCalendar().getActualMaximum(Calendar.DAY_OF_MONTH))
{
    System.out.println("31 days on this month");
}
else
{
    System.out.println("Not 31 days in this month");
}

Écrivez le nombre de jours pour tous les mois

Calendar cal = new GregorianCalendar();
for (int i = 0; i < 12; i++)
{
    cal.set(2009, i, 1); //note that the month in Calendar goes from 0-11
    int humanMonthNumber = i + 1;
    int max = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
    System.out.println("The " + humanMonthNumber + ". month has " + max  + " days.");
}

sortie:

This month has 30 days in it.
Not 31 days in this month
The 1. month has 31 days.
The 2. month has 28 days.
The 3. month has 31 days.
The 4. month has 30 days.
The 5. month has 31 days.
The 6. month has 30 days.
The 7. month has 31 days.
The 8. month has 31 days.
The 9. month has 30 days.
The 10. month has 31 days.
The 11. month has 30 days.
The 12. month has 31 days.

Une traduction plutôt littérale en Java serait:

if (Arrays.binarySearch(new int[] { 4, 6, 9, 11 }, month) >= 0) {

Je ne sais pas ce qui est si spécial dans 4, 6, 9 et 11. Vous feriez probablement mieux d'utiliser une enum, avec EnumSet ou peut-être une méthode sur l'énum. OTOH, peut-être que JodaTime fait quelque chose d’utile.

Je pense que votre code sera plus auto-documenté si vous utilisez les constantes statiques intégrées à Calendar (par exemple, Calendar.JANUARY, etc.)

Si vous le faites souvent - plus d'une fois - je vous recommanderais d'écrire une méthode nommée has31Days () ou isReportMonth () pour effectuer la vérification à un endroit.

MISE À JOUR:

L'important, ce ne sont pas les mois qui comptent 31 jours - c'est la règle commerciale qui vous dit quelque chose sur les rapports pour ces mois.

Je pourrais l'écrire comme ceci (j'espère que les mois avec 31 jours seront bons):

public class ReportEngine
{
    public boolean isReportRequired(int month)
    {
        if ((month < Calendar.JANUARY) || (month > Calendar.DECEMBER))
            throw new IllegalArgumentException("Invalid month: " + month);

        // Reports are required for months with 31 days.
        return ((month == Calendar.JANUARY) || 
                (month == Calendar.MARCH) || 
                (month == Calendar.MAY) ||
                (month == Calendar.JULY) || 
                (month == Calendar.AUGUST) || 
                (month == Calendar.OCTOBER) ||
                (month == Calendar.DECEMBER));
    }
}

Si vous vérifiez si un mois compte plus de 31 jours, la manière la plus simple de l'écrire serait (en Java):

 public static boolean hasMoreThan31Days(final int month) {
    return false;
   } 

Ne faites pas de vérifications spécifiques. Essayez de convertir en une date valide - si elle lève une exception, signalez la date invalide. Après tout, vous devez également vérifier pour le jour supérieur à 28 (ou est-ce 29?) Si le mois est en février.

C # comme je ne connais pas Java:

int [] DaysInMonth = new int [] {31, 28, 31, 30, 31, 30, 31, 30, 31, 30, 31}

if (DaysInMonth [month] == 31) ...

Oubliez la logique sophistiquée préconisée par de nombreuses personnes: cette méthode est beaucoup plus claire et facile à déboguer.

Toutefois, pour répondre à la question que vous avez réellement posée dans votre message:

if (false) ...

car il n'y a pas de mois avec PLUS de 31 jours!

Edit: Oui, je n'ai pas abordé l'année bissextile. Cela doit être traité séparément. La question était de savoir si le mois comptait 31 jours, ce à quoi le mien FAIT répond. J'aurais pu le faire avec un tableau de bools, mais puisque le tableau doit être là de toute façon, pourquoi ne pas mettre les longueurs?

Pour les dates que j'utilise, Joda Time est mentionné plus tôt, mais je comprends si cela ne vous concerne pas . Si vous voulez juste que ça ait l'air bien, vous pouvez d'abord définir une liste avec les valeurs qui vous intéressent et ensuite vérifier si votre mois est dans cette liste:

// This should be a field in a class
// Make it immutable
public static final List<Integer> LONGEST_MONTHS = 
        Collections.immutableList(Arrays.asList(4,6,9,11));

// Somewhere in your code
if(LONGEST_MONTHS.contains(month)) {
    doSomething();
}

Aucune question sur les dates et Java ne serait complète sans mentionner Heure Joda .

for(int i = DateTimeConstants.JANUARY; i <= DateTimeConstants.DECEMBER; i++) {
    LocalDate localDate = new LocalDate().withMonthOfYear(i);
    System.out.println("    " +localDate.toString("MMMM") + " - " + localDate.dayOfMonth().getMaximumValue());
}
  

Janvier - 31
  29 février -

  31 mars -
  30 avril -

  31 mai -
  30 juin -

  Juillet - 31
  31 août -
  30 septembre -
  31 octobre -

  30 novembre -

  31 décembre -

Fonction Simpe Aux (C #) qui vous donne le nombre de jours d'un mois donné:

    private int GetDaysInMonth(DateTime date)
    {
        return new DateTime(date.Year, date.Month, 1).AddMonths(1).AddDays(-1).Day;
    }

J'espère que ça aide

Pour presque tous, vous aurez besoin d'utiliser la deuxième option, mais dans la plupart des langues, vous pouvez écrire quelque chose de similaire à

.
if [4,6,9,11].map{|day|==month}.inject(false){|all, elem| all|elem}
    do thing

ou mieux encore

if month in [4,6,9,11]:
    do thing

Peut-être que si vous utilisez C #, vous pouvez le faire:

public static class Extensions 
{
 public static bool IsIn(this Int32 intVal, params Int32[] vals)
 {
   return vals.Any(i => i == intVal)
 }
}

int month = 4;
if (month.IsIn(4,6,9,11)) {
//do something
}

Dans Icon, vous pouvez faire

if month = (4|6|9|11) then ...

Vous pouvez également faire

if a < b < c then ...

Voir aussi

Suis-je le seul à proposer

month_has_31days = month % 2 == month < 8

au moins en C, impossible de vérifier java pour le moment

Une solution complète, tenant également compte des années bissextiles.

private static int getDaysInMonth(LocalDateTime localDateTime) {

    int daysInMonth = 0;
    int year = localDateTime.getYear();
    int month = localDateTime.getMonth().getValue();

    switch (month) {
        case 1: case 3: case 5:
        case 7: case 8: case 10:
        case 12:
            daysInMonth = 31;
            break;
        case 4: case 6:
        case 9:case 11:
            daysInMonth = 30;
            break;
        case 2:
            if(((year % 4 == 0) && !(year % 100 == 0) || (year % 400 == 0))) {
                daysInMonth = 29;
            } else {
                daysInMonth = 28;
            }
            break;
        default: System.out.println("Invalid month");
            break;
    }

    return daysInMonth;
}

tl; dr

EnumSet.of( Month.JANUARY , Month.MARCH , Month.MAY , Month.JULY , Month.AUGUST , Month.OCTOBER , Month.DECEMBER )
       .contains( Month.from( LocalDate.now() ) )

java.time

L’approche moderne utilise les classes java.time qui supplantent les anciennes classes gênantes de date et d’heure.

Le Mois Enum définit un objet pour chaque mois de l'année.

EnumSet<Month> thirtyOneDayMonths = EnumSet.noneOf( Month.class ) ;
for( Month month : Month.values() ) {
    if( month.maxLength() == 31 ) {
        thirtyOneDayMonths.add( month ) ;
    }
}

Vérifiez si le mois en cours fait partie de cette collection de mois comptant 31 jours.

LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) ) ;
Month currentMonth = Month.from( today ) ;
if( thirtyOneDayMonths.contains( currentMonth ) ) {
    …
}

Vous pouvez également interroger la date d'aujourd'hui .

LocalDate.now( ZoneId.of( "Pacific/Auckland" ) )
         .lengthOfMonth()

À propos de java.time

Le java.time Le framework est intégré à Java 8 et supérieur. Ces classes supplantent les anciennes classes de date-heure héritées , telles que java.util.Date , Agenda , & amp ; SimpleDateFormat .

Le projet Joda-Time , maintenant dans mode maintenance , conseille la migration vers le classes java.time .

Pour en savoir plus, consultez le Didacticiel Oracle . Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 310 .

Où obtenir les classes java.time?

Le projet ThreeTen-Extra étend le java.time avec des cours supplémentaires. Ce projet est un terrain d’essai pour d’éventuels ajouts à java.time. Vous pouvez trouver ici des classes utiles telles que Intervalle , YearWeek , < code> YearQuarter , et plus .

Passez au premier du mois prochain et soustrayez un jour.

Calendar  cal=Calendar.getInstance();
cal.add(Calendar.MONTH,1);
cal.set(Calendar.DAY_OF_MONTH,1);
cal.add(Calendar.DATE, -1);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top