Pergunta

Existe uma forma análoga de código a seguir:

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

ou deve ser:

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

Eu estou tentando escrever uma declaração if que verifica se este mês tem mais de 31 dias.

Editar

Eu acho que o verdadeiro problema é que eu undersand pouco do que eu sou ensinado, mas cada vez que eu tento usar o site do sol sobre java ele só me confunde. A minha pergunta é se eu ficar um mês a partir de um usuário e um dia e eu colocá-lo em um formato MM / dd e avaliá-lo, em seguida, há uma maneira mais fácil de verificar se o mês eo dia é válido e depois que eu verifique se sendo I válida tanto pode imprimir o MM / dd no formato que eu tenho. Se não é válido Imprimir uma linha que diz mês inválido ou dia.

Foi útil?

Solução

Se você estiver usando C ou Java, você pode fazer isso:

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

Em alguns idiomas, você pode até escrever case 4,6,9,11:. Outras possibilidades seria a de criar uma matriz [4,6,9,11], algumas linguagens funcionais devem permitir algo como if month in [4,6,9,11] do something;

Como Lior disse, isso depende da linguagem.

EDIT: By the way, você também pode fazer isso (apenas por diversão, código ruim porque não legível):

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

Outras dicas

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

cara, isso é ridículo. (month==4||month==6||month==9||month==11) é perfeitamente ok.

Você não especificar o idioma, mas se você estiver usando Java, então sim, você tem pratico a segunda maneira, ou de outra forma usar switch:

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

Como alternativa, você pode achar que é útil e mais limpa (dependendo do projeto) não codificar os valores mas mantê-los em outro 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 mês

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

if para verificar se há 31 dias no mês

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

Write número de dias para todos os 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.");
}

saída:

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.

Uma tradução bastante literal em Java seria:

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

Eu não sei o que é tão especial cerca de 4, 6, 9 e 11. Você é provavelmente melhor fora de usar um enum, juntamente com EnumSet ou talvez um método na enumeração. OTOH, talvez JodaTime faz algo útil.

Eu acho que o seu código será mais autodocumentados se você usar as constantes estáticas em calendário (por exemplo, Calendar.JANUARY, etc.)

Se você fizer isso muitas vezes - mais de uma vez -. Eu recomendo escrevendo um método chamado has31Days () ou isReportMonth () para fazer o check-in um lugar

UPDATE:

O importante não são os meses que têm 31 dias. - É a regra de negócio que você diz algo sobre relatórios para esses meses

Eu poderia escrever assim (espero que eu tenho os meses com 31 dias direita):

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 você está verificando se um mês tem mais de 31 dias, a maneira mais simples de escrever seria (em Java):

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

Não faça quaisquer controlos específicos. Experimente e convertido para uma data válida - se ele lança uma exceção, relatar data inválida. Afinal, você também precisa verificar para o dia acima de 28 (ou é 29?) Se o mês é fevereiro.

C #, como eu não sei Java:

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

if (DaysInMonth [mês] == 31) ...

Esqueça a lógica de fantasia que muitas pessoas estão defendendo -. Desta forma é muito mais claro e mais fácil de depurar

No entanto, para responder à pergunta que você realmente pediu em sua mensagem:

if (false) ...

como não há meses com mais de 31 dias!

Edit: Sim, eu não lidar com o ano bissexto. Isso tem que ser tratado separadamente. A questão era se o mês tinha 31 dias, embora - algo meu O resposta. Eu poderia ter feito isso com uma variedade de bools mas desde que as necessidades de matriz para estar lá de qualquer maneira por que não colocar os comprimentos em?

Para datas Eu uso Joda Tempo mencionado anteriormente, mas eu entendo se não é aplicável para você . Se você só quer olhar bom, você pode primeiro definir uma lista com os valores que você está interessado e, em seguida, verificar se o seu mês é nessa 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();
}

Não há dúvida sobre datas e Java seria completa sem mencionar Joda Tempo .

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

Janeiro - 31
Fevereiro - 29
Março - 31
Abril - 30
Maio - 31
Junho - 30
Julho - 31
Agosto - 31
Setembro - 30
Outubro - 31
Novembro - 30
Dezembro - 31

Simpe Aux função (C #) que lhe dá o número de dias de um determinado mês:

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

Hope isso ajuda

Para praticamente qualquer você vai precisar usar a segunda opção, mas na maioria dos idiomas que você pode escrever algo semelhante a

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

ou ainda melhor

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

Talvez se você estiver usando C # você pode fazer isso:

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
}

Em Ícone, você pode fazer

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

Você também pode fazer

if a < b < c then ...

Veja também

Eu sou o único a vir para cima com

month_has_31days = month % 2 == month < 8

pelo menos em C, não pode verificar a existência de java agora

Uma solução completa, tendo também ano bissexto em conta.

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

A abordagem moderna usa as classes java.time que suplantar as classes de data e hora velhos problemáticos.

O Month enum define um objeto para cada mês do ano.

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

Veja se o mês atual está em que a coleta de meses que têm 31 dias.

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

Ou você poderia apenas interrogar a data de hoje .

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

Sobre java.time

O java.time quadro é construído em Java 8 e posterior. Essas classes suplantar o problemático idade legados aulas de data e hora, como java.util.Date , Calendar , e SimpleDateFormat .

O Joda-Time projeto, agora em modo de manutenção , aconselha migração para o java.time classes.

Para saber mais, consulte a a Oracle Tutorial . E busca Stack Overflow para muitos exemplos e explicações. Especificação é JSR 310 .

Onde obter as classes java.time?

O ThreeTen-Extra projeto estende java.time com aulas adicionais. Este projeto é um campo de provas para possíveis adições futuras para java.time. Você pode encontrar algumas classes úteis aqui, como Interval , YearWeek , YearQuarter e mais .

Mover para o primeiro do próximo mês e subtrair um dia.

Calendar  cal=Calendar.getInstance();
cal.add(Calendar.MONTH,1);
cal.set(Calendar.DAY_OF_MONTH,1);
cal.add(Calendar.DATE, -1);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top