Pregunta

¿Existe una forma análoga del siguiente código:

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

O debe ser:

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

Estoy tratando de escribir una declaración if que compruebe si este mes tiene más de 31 días.

EDIT

Supongo que el verdadero problema es que entiendo algo de lo que me enseñan, pero cada vez que trato de usar el sitio web de Sun sobre Java, me confunde. Mi pregunta es si recibo un mes de un usuario y un día y lo pongo en un formato MM / dd y lo evalúo, entonces ¿hay una manera más fácil de verificar si el mes y el día son válidos y después de verificarlo? siendo válido, puedo imprimir el MM / dd en el formato que tengo. Si no es válido, imprima una línea que diga mes o día no válido.

¿Fue útil?

Solución

Si está utilizando C o Java, puede hacer esto:

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

En algunos idiomas, incluso podría escribir en el caso 4,6,9,11: . Otras posibilidades serían crear una matriz [4,6,9,11], algunos lenguajes funcionales deberían permitir algo como si el mes en [4,6,9,11] hace algo;

Como dijo Lior, depende del idioma.

EDITAR: Por cierto, también puedes hacer esto (solo por diversión, código malo porque no se puede leer):

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

Otros consejos

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

amigo, esto es ridículo. (mes == 4 || mes == 6 || mes == 9 || mes == 11) está perfectamente bien.

No especificas el idioma, pero si estás usando Java, entonces sí, debes hacerlo de la segunda forma, o de lo contrario usar el interruptor:

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

Como alternativa, puede que le resulte útil y más limpio (según el diseño) no codificar los valores sino guardarlos en otro lugar:

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

Este mes

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

si hay una declaración para verificar si hay 31 días en este mes

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

Escriba el número de días para todos los meses

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

salida:

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 traducción bastante literal a Java sería:

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

No sé qué tiene de especial 4, 6, 9 y 11. Probablemente sea mejor usar una enumeración, junto con EnumSet o tal vez un método en la enumeración. OTOH, tal vez JodaTime haga algo útil.

Creo que su código se documentará más si usa las constantes estáticas integradas en Calendar (por ejemplo, Calendar.JANUARY, etc.)

Si hace esto con frecuencia, más de una vez, le recomendaría escribir un método llamado has31Days () o isReportMonth () para hacer la verificación en un solo lugar.

ACTUALIZACIÓN:

Lo importante no son los meses que tienen 31 días: es la regla de negocios que le dice algo sobre los informes de esos meses.

Es posible que lo escriba así (espero que tenga los meses correctos con 31 días):

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 está comprobando si un mes tiene más de 31 días, la forma más sencilla de escribirlo sería (en Java):

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

No haga ninguna verificación específica. Intente y convierta a una fecha válida: si lanza una excepción, informe la fecha no válida. Después de todo, también debe verificar el día mayor de 28 (¿o es 29?) Si el mes es febrero.

C # como no sé Java:

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

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

Olvídese de la lógica sofisticada que muchas personas defienden: de esta manera es mucho más claro y fácil de depurar.

Sin embargo, para responder a la pregunta que realmente hizo en su mensaje:

si (falso) ...

¡ya que no hay meses con MÁS que 31 días!

Edit: Sí, no abordé el año bisiesto. Eso tiene que ser manejado por separado. Sin embargo, la pregunta era si el mes tenía 31 días, algo que responde . Podría haberlo hecho con una serie de bools, pero dado que la matriz debe estar allí de todos modos, ¿por qué no poner las longitudes?

Para las fechas utilizo Joda Time mencionado anteriormente, pero entiendo si no es aplicable para usted . Si solo quiere que se vea bien, primero puede definir una lista con los valores que le interesan y luego verificar si su mes está en esa lista:

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

No hay dudas sobre las fechas y Java estaría completo sin mencionar 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());
}
  

enero - 31
  Febrero - 29
  Marzo - 31
  Abril - 30
  Mayo - 31
  30 de junio -   Julio - 31
  Agosto - 31
  Septiembre - 30
  31 de octubre -   30 de noviembre -   31 de diciembre

Función Aux Simpe (C #) que le brinda la cantidad de días de un mes determinado:

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

Espero que ayude

Para prácticamente cualquier cosa, necesitarás usar la segunda opción, pero en la mayoría de los idiomas puedes escribir algo similar a

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

o mejor aún

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

Quizás si está usando C # puede hacer esto:

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
}

En Icon, puedes hacerlo

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

También puedes hacer

if a < b < c then ...

Ver también

¿Soy el único que se me ocurre?

month_has_31days = month % 2 == month < 8

al menos en C, no puedo buscar java en este momento

Una solución completa, que también tiene en cuenta el año bisiesto.

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

El enfoque moderno utiliza las clases java.time que suplantan a las antiguas y problemáticas clases de fecha y hora.

El Month la enumeración define un objeto para cada mes del año.

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

Vea si el mes actual está en esa colección de meses que tienen 31 días.

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

O simplemente puede interrogar la fecha de hoy .

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

Acerca de java.time

El java.time framework está integrado en Java 8 y versiones posteriores. Estas clases suplantan las viejas y problemáticas legacy clases de fecha y hora como java.util.Date , Calendario , y amp ; SimpleDateFormat .

El Joda-Time , ahora en modo de mantenimiento , aconseja la migración a java.time .

Para obtener más información, consulte el Tutorial de Oracle . Y busca Stack Overflow para muchos ejemplos y explicaciones. La especificación es JSR 310 .

¿Dónde obtener las clases java.time?

El proyecto ThreeTen-Extra se extiende a java.time con clases adicionales Este proyecto es un terreno de prueba para posibles adiciones futuras a java.time. Puede encontrar algunas clases útiles aquí como Intervalo , YearWeek , < código> YearQuarter , y más .

Mueve al primer día del mes siguiente y resta un día.

Calendar  cal=Calendar.getInstance();
cal.add(Calendar.MONTH,1);
cal.set(Calendar.DAY_OF_MONTH,1);
cal.add(Calendar.DATE, -1);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top