Domanda

Esiste una forma analoga del seguente codice:

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

O deve essere:

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

Sto cercando di scrivere un'istruzione if che controlla se questo mese ha più di 31 giorni.

Modifica

Immagino che il vero problema sia che sottolineo un po 'di ciò che mi viene insegnato, ma ogni volta che provo ad usare il sito web Sun su Java mi confonde. La mia domanda è se ricevo un mese da un utente e un giorno e lo inserisco in un formato MM / gg e lo valuto, allora c'è un modo più semplice per verificare se il mese e il giorno sono validi e dopo averlo verificato per essendo valido posso sia stampare MM / gg nel formato che ho. Se non è valido Stampa una riga che indica il mese o il giorno non valido.

È stato utile?

Soluzione

Se stai usando C o Java, puoi farlo:

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

In alcune lingue, potresti persino scrivere case 4,6,9,11: . Altre possibilità sarebbero quelle di creare un array [4,6,9,11], alcuni linguaggi funzionali dovrebbero consentire qualcosa come se il mese in [4,6,9,11] fa qualcosa;

Come ha detto Lior, dipende dalla lingua.

EDIT: A proposito, potresti anche farlo (solo per divertimento, codice errato perché non leggibile):

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

Altri suggerimenti

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

amico, questo è ridicolo. (mese == 4 || mese == 6 || mese == 9 || mese == 11) è perfettamente ok.

Non specifichi la lingua, ma se stai usando Java, allora sì, devi farlo nel secondo modo, oppure usare switch:

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

In alternativa, potresti trovare utile e più pulito (a seconda del design) non codificare i valori ma tenerli altrove:

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

Questo mese

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

if statement per verificare se ci sono 31 giorni in questo mese

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

Scrivi il numero di giorni per tutti i mesi

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

uscita:

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.

Una traduzione piuttosto letterale in Java sarebbe:

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

Non so cosa c'è di così speciale in 4, 6, 9 e 11. Probabilmente stai meglio usando un enum, insieme a EnumSet o forse un metodo sull'enum. OTOH, forse JodaTime fa qualcosa di utile.

Penso che il tuo codice sarà più autocompattante se usi le costanti statiche integrate in Calendar (ad esempio Calendar.JANUARY, ecc.)

Se lo fai spesso - più di una volta - ti consiglio di scrivere un metodo chiamato has31Days () o isReportMonth () per fare il controllo in un unico posto.

UPDATE:

L'importante non sono i mesi che hanno 31 giorni: è la regola aziendale che ti dice qualcosa sui rapporti per quei mesi.

Potrei scriverlo in questo modo (spero di avere i mesi con 31 giorni giusti):

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

Se stai verificando se un mese ha più di 31 giorni, il modo più semplice per scriverlo sarebbe (in Java):

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

Non eseguire controlli specifici. Prova e converti in una data valida: se genera un'eccezione, segnala una data non valida. Dopo tutto, devi anche controllare che il giorno sia maggiore di 28 (o è 29?) Se il mese è febbraio.

C # come non conosco Java:

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

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

Dimentica la logica elaborata che molte persone sostengono: in questo modo è molto più chiaro e più facile eseguire il debug.

Tuttavia, per rispondere alla domanda che hai effettivamente posto nel tuo messaggio:

if (false) ...

poiché non ci sono mesi con ALTRO di 31 giorni!

Modifica: Sì, non ho affrontato l'anno bisestile. Deve essere gestito separatamente. La domanda era se il mese avesse 31 giorni, qualcosa a cui il mio FA risponde. Avrei potuto farlo con un array di bool ma dato che l'array deve essere lì comunque perché non mettere le lunghezze?

Per le date che uso Joda Time menzionato in precedenza, ma capisco se non è applicabile per te . Se vuoi solo che appaia bello, puoi prima definire un elenco con i valori che ti interessano e quindi verificare se il tuo mese è in quell'elenco:

// 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();
}

Nessuna domanda sulle date e Java sarebbe completa senza menzionare Joda Time .

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

gennaio - 31
  Febbraio - 29
  Marzo - 31
  Aprile - 30
  Maggio - 31
  Giugno - 30
  Luglio - 31
  Agosto - 31
  Settembre - 30
  Ottobre - 31
  Novembre - 30
  31 dicembre

Funzione Simpe Aux (C #) che ti dà il numero di giorni di un determinato mese:

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

Spero che sia d'aiuto

Per quasi tutti dovrai usare la seconda opzione, ma nella maggior parte delle lingue puoi scrivere qualcosa di simile a

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

o meglio ancora

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

Forse se stai usando C # puoi farlo:

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
}

In Icon, puoi farlo

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

Puoi anche fare

if a < b < c then ...

Vedi anche

Sono l'unico a trovarmi

month_has_31days = month % 2 == month < 8

almeno in C, non posso controllare java in questo momento

Una soluzione completa, che tiene conto anche dell'anno bisestile.

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'approccio moderno utilizza le classi java.time che soppiantano le vecchie e problematiche classi data-ora.

Il Month enum definisce un oggetto per ogni mese dell'anno.

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

Verifica se il mese corrente si trova in quella raccolta di mesi con 31 giorni.

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

Oppure potresti interrogare data odierna .

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

Informazioni su java.time

Il java.time framework è integrato in Java 8 e versioni successive. Queste classi soppiantano le vecchie e problematiche legacy classi data-ora come java.util.Date , Calendar , & amp ; SimpleDateFormat .

Il Joda-Time , ora in modalità di manutenzione , consiglia la migrazione a classi java.time .

Per saperne di più, consulta il Tutorial Oracle . E cerca Stack Overflow per molti esempi e spiegazioni. La specifica è JSR 310 .

Dove ottenere le classi java.time?

Il progetto ThreeTen-Extra estende java.time con classi aggiuntive. Questo progetto è un banco di prova per possibili aggiunte future a java.time. Puoi trovare alcune lezioni utili qui come Interval , YearWeek , < code> YearQuarter e altro .

Passa al primo del mese successivo e sottrai un giorno.

Calendar  cal=Calendar.getInstance();
cal.add(Calendar.MONTH,1);
cal.set(Calendar.DAY_OF_MONTH,1);
cal.add(Calendar.DATE, -1);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top