Número de dias em determinado mês do ano em particular?

158

Como saber quantos dias tem determinado mês de ano em particular?

String date = "2010-01-19";
String[] ymd = date.split("-");
int year = Integer.parseInt(ymd[0]);
int month = Integer.parseInt(ymd[1]);
int day = Integer.parseInt(ymd[2]);
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR,year);
calendar.set(Calendar.MONTH,month);
int daysQty = calendar.getDaysNumber(); // Something like this
Klausos Klausos
fonte
7
Qual é a tua pergunta exatamente?
ShaMan-H_Fel
FYI, os terrivelmente problemáticas aulas em tempo data antigas, tais como java.util.Date, java.util.Calendar, eo java.text.SimpleDateFormatestão agora legado , suplantado pelos java.time classes internas em Java 8 e posterior. Consulte o Tutorial da Oracle .
Basil Bourque

Respostas:

367

Java 8 e posterior

@Warren M. Nocos. Se você estiver tentando usar a nova API de data e hora do Java 8 , poderá usar a java.time.YearMonthclasse Consulte o Tutorial do Oracle .

// Get the number of days in that month
YearMonth yearMonthObject = YearMonth.of(1999, 2);
int daysInMonth = yearMonthObject.lengthOfMonth(); //28  

Teste: tente um mês em um ano bissexto:

yearMonthObject = YearMonth.of(2000, 2);
daysInMonth = yearMonthObject.lengthOfMonth(); //29 

Java 7 e anterior

Crie um calendário, defina ano e mês e use getActualMaximum

int iYear = 1999;
int iMonth = Calendar.FEBRUARY; // 1 (months begin with 0)
int iDay = 1;

// Create a calendar object and set year and month
Calendar mycal = new GregorianCalendar(iYear, iMonth, iDay);

// Get the number of days in that month
int daysInMonth = mycal.getActualMaximum(Calendar.DAY_OF_MONTH); // 28

Teste : tente um mês em um ano bissexto:

mycal = new GregorianCalendar(2000, Calendar.FEBRUARY, 1);
daysInMonth= mycal.getActualMaximum(Calendar.DAY_OF_MONTH);      // 29
Hemant Metalia
fonte
2
Como fazer isso na nova API de data e hora do Java 8?
Warren M.Nocos #
2
@ WarrenM.Nocos desculpe pela resposta tardia, mas eu não estava ativo esses meses. por favor, verifique a edição para a solução de java 8.
Hemant Metalia
Quanto ao Java 8… grande parte da funcionalidade java.time é portada para Java 6 e Java 7 no projeto ThreeTen-Backport . Mais adaptado para Android anterior no projeto ThreeTenABP . Consulte Como usar o ThreeTenABP… .
Basil Bourque
43

Código para java.util.Calendar

Se você precisar usar java.util.Calendar, suspeito que você queira:

int days = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);

Código para o tempo de Joda

Pessoalmente, no entanto, sugiro usar o Joda Time em vez de java.util.{Calendar, Date}começar. Nesse caso, você pode usar:

int days = chronology.dayOfMonth().getMaximumValue(date);

Observe que, em vez de analisar os valores de sequência individualmente, seria melhor obter a API de data / hora que você está usando para analisá-la. Em java.util.*você pode usar SimpleDateFormat; em Joda Time, você usaria a DateTimeFormatter.

Jon Skeet
fonte
26

Você pode usar o Calendar.getActualMaximummétodo:

Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.MONTH, month);
int numDays = calendar.getActualMaximum(Calendar.DATE);
Aleks G
fonte
22

java.time.LocalDate

No Java 1.8, você pode usar o método lengthOfMonthem java.time.LocalDate:

LocalDate date = LocalDate.of(2010, 1, 19);
int days = date.lengthOfMonth();
Alexandre DuBreuil
fonte
7
if (month == 4 || month == 6 || month == 9 || month == 11)

daysInMonth = 30;

else 

if (month == 2) 

daysInMonth = (leapYear) ? 29 : 28;

else 

daysInMonth = 31;
zoidbot
fonte
Calendário c = Calendar.getInstance (); c.set (Calendar.DAY_OF_MONTH, c.getActualMaximum (Calendar.DAY_OF_MONTH)); // você pode definir o ano antes de obter o máximo real, pois eles podem não ser os mesmos. ou seja, fevereiro de 2011 e 2012 não é da mesma duração (ano bissexto) #
187
5

Esta é a maneira matemática:

Por ano, mês (1 a 12):

int daysInMonth = month == 2 ? 
    28 + (year % 4 == 0 ? 1:0) - (year % 100 == 0 ? (year % 400 == 0 ? 0 : 1) : 0) :
    31 - (month-1) % 7 % 2;
Shl
fonte
3

Eu iria para uma solução como esta:

int monthNr = getMonth();
final Month monthEnum = Month.of(monthNr);
int daysInMonth;
if (monthNr == 2) {
    int year = getYear();
    final boolean leapYear = IsoChronology.INSTANCE.isLeapYear(year);
    daysInMonth = monthEnum.length(leapYear);
} else {
    daysInMonth = monthEnum.maxLength();
}

Se o mês não é fevereiro (92% dos casos), depende apenas do mês e é mais eficiente não envolver o ano. Dessa forma, você não precisa chamar a lógica para saber se é um ano bissexto e não precisa obter o ano em 92% dos casos. E ainda é um código limpo e muito legível.

Stefan Mondelaers
fonte
1
Prefiro deixar toda a lógica para um método de biblioteca comprovado - acho que você está otimizando muito prematuramente, e os métodos de biblioteca não são tão ineficientes. Ainda com votos positivos para o uso do java.time moderno.
Ole VV
@ OleV.V. É verdade que, em muitos casos, deixar a otimização em uma biblioteca comprovada pode ser melhor. Mas, nesse caso, as bibliotecas existentes precisarão passar um mês e ano. Isso significa que eu preciso fazer o que for preciso para obter o ano de qualquer maneira, mesmo que o método não use o valor em 92% dos casos. Então, essa é uma parte que não pode otimizar para mim. Meu raciocínio é semelhante ao motivo pelo qual você não deve fazer uma chamada de método para obter um valor a ser passado para um logger que possa estar desabilitado. De maneira alguma o logger pode otimizar isso.
Stefan Mondelaers
1

No Java8, você pode usar get ValueRange a partir de um campo de uma data.

LocalDateTime dateTime = LocalDateTime.now();

ChronoField chronoField = ChronoField.MONTH_OF_YEAR;
long max = dateTime.range(chronoField).getMaximum();

Isso permite parametrizar no campo.

Jamie Lister
fonte
1

Simples assim, não há necessidade de importar nada

public static int getMonthDays(int month, int year) {
    int daysInMonth ;
    if (month == 4 || month == 6 || month == 9 || month == 11) {
        daysInMonth = 30;
    }
    else {
        if (month == 2) {
            daysInMonth = (year % 4 == 0) ? 29 : 28;
        } else {
            daysInMonth = 31;
        }
    }
    return daysInMonth;
}
Ajay Chauhan
fonte
Tudo bem, se você não precisar de datas históricas ou datas em um futuro distante. Em fevereiro de anos, múltiplos de 100, mas não de 400, estará errado. Mas eu concordo que, na maioria das aplicações, isso serve e é eficiente.
Stefan Mondelaers
1
// 1 means Sunday ,2 means Monday .... 7 means Saturday
//month starts with 0 (January)

MonthDisplayHelper monthDisplayHelper = new MonthDisplayHelper(2019,4);
int numbeOfDaysInMonth = monthDisplayHelper.getNumberOfDaysInMonth();
user11527435
fonte
1
Vale a pena notar que é para Android ( android.util.MonthDisplayHelper)
barbsan
0
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/*
 * 44. Return the number of days in a month
 * , where month and year are given as input.
 */
public class ex44 {
    public static void dateReturn(int m,int y)
    {
        int m1=m;
        int y1=y;
        String str=" "+ m1+"-"+y1;
        System.out.println(str);
        SimpleDateFormat sd=new SimpleDateFormat("MM-yyyy");

        try {
            Date d=sd.parse(str);
            System.out.println(d);
            Calendar c=Calendar.getInstance();
            c.setTime(d);
            System.out.println(c.getActualMaximum(Calendar.DAY_OF_MONTH));
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
    public static void main(String[] args) {
dateReturn(2,2012);


    }

}
madhi vanan
fonte
1
Que valor essa resposta fornece sobre as respostas existentes e aceitas? Além disso, adicione alguma explicação ou narrativa junto com o seu código. StackOverflow é mais do que uma biblioteca de trechos.
Basil Bourque 10/09
0
public class Main {

    private static LocalDate local=LocalDate.now();
    public static void main(String[] args) {

            int month=local.lengthOfMonth();
            System.out.println(month);

    }
}
Nodirbek Hasanboev
fonte
6
Adicione algumas explicações também.
Blackbeard
1
Bem-vindo ao Stack Overflow! Embora esse snippet de código possa ser a solução, incluir uma explicação realmente ajuda a melhorar a qualidade da sua postagem. Lembre-se de que você está respondendo à pergunta dos leitores no futuro e essas pessoas podem não saber os motivos da sua sugestão de código.
yivi
0

O uso de CalendarAPI desatualizada deve ser evitado.

Na versão Java8 ou superior, isso pode ser feito YearMonth.

Código de exemplo:

int year = 2011;
int month = 2;
YearMonth yearMonth = YearMonth.of(year, month);
int lengthOfMonth = yearMonth.lengthOfMonth();
System.out.println(lengthOfMonth);
user6690200
fonte
Call requires API level 26 (current min is 21): java.time.YearMonth#lengthOfMonth
4134 Vlad
0

Vamos simplificar se você não desejar codificar o valor do ano e do mês e quiser usar o valor da data e hora atuais:

Date d = new Date();
String myDate = new SimpleDateFormat("dd/MM/yyyy").format(d);
int iDayFromDate = Integer.parseInt(myDate.substring(0, 2));
int iMonthFromDate = Integer.parseInt(myDate.substring(3, 5));
int iYearfromDate = Integer.parseInt(myDate.substring(6, 10));

YearMonth CurrentYear = YearMonth.of(iYearfromDate, iMonthFromDate);
int lengthOfCurrentMonth = CurrentYear.lengthOfMonth();
System.out.println("Total number of days in current month is " + lengthOfCurrentMonth );
RANA DINESH
fonte
0

Você pode usar o método Calendar.getActualMaximum:

Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.MONTH, month-1);
int numDays = calendar.getActualMaximum(Calendar.DATE);

E o mês 1 é Por causa do mês, leva o número original do mês, enquanto no método, leva o argumento conforme mostrado abaixo em Calendar.class

public int getActualMaximum(int field) {
   throw new RuntimeException("Stub!");
}

E o (campo int) é como abaixo.

public static final int JANUARY = 0;
public static final int NOVEMBER = 10;
public static final int DECEMBER = 11;
Dharmishtha
fonte
0

O método a seguir fornecerá o número de dias em um determinado mês

public static int getNoOfDaysInAMonth(String date) {
    Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    return (cal.getActualMaximum(Calendar.DATE));
}
Tanmay kumar shaw
fonte
0

Uma variação ótima e de alto desempenho:

public static int daysInMonth(int month, int year) {
    if (month != 2) {
        return 31 - (month - 1) % 7 % 2;
    }
    else {
        if ((year & 3) == 0 && ((year % 25) != 0 || (year & 15) == 0)) { // leap year
            return 29;
        } else {
            return 28;
        }
    }
}

Para mais detalhes sobre o algoritmo de salto, verifique aqui

artesão
fonte
-1
String  MonthOfName = "";
int number_Of_DaysInMonth = 0;

//year,month
numberOfMonth(2018,11); // calling this method to assign values to the variables MonthOfName and number_Of_DaysInMonth 

System.out.print("Number Of Days: "+number_Of_DaysInMonth+"   name of the month: "+  MonthOfName );

public void numberOfMonth(int year, int month) {
    switch (month) {
        case 1:
            MonthOfName = "January";
            number_Of_DaysInMonth = 31;
            break;
        case 2:
            MonthOfName = "February";
            if ((year % 400 == 0) || ((year % 4 == 0) && (year % 100 != 0))) {
                number_Of_DaysInMonth = 29;
            } else {
                number_Of_DaysInMonth = 28;
            }
            break;
        case 3:
            MonthOfName = "March";
            number_Of_DaysInMonth = 31;
            break;
        case 4:
            MonthOfName = "April";
            number_Of_DaysInMonth = 30;
            break;
        case 5:
            MonthOfName = "May";
            number_Of_DaysInMonth = 31;
            break;
        case 6:
            MonthOfName = "June";
            number_Of_DaysInMonth = 30;
            break;
        case 7:
            MonthOfName = "July";
            number_Of_DaysInMonth = 31;
            break;
        case 8:
            MonthOfName = "August";
            number_Of_DaysInMonth = 31;
            break;
        case 9:
            MonthOfName = "September";
            number_Of_DaysInMonth = 30;
            break;
        case 10:
            MonthOfName = "October";
            number_Of_DaysInMonth = 31;
            break;
        case 11:
            MonthOfName = "November";
            number_Of_DaysInMonth = 30;
            break;
        case 12:
            MonthOfName = "December";
            number_Of_DaysInMonth = 31;
    }
}
azhar
fonte
-1

Isso funcionou bem pra mim.

Esta é uma saída de amostra

import java.util.*;

public class DaysInMonth { 

    public static void main(String args []) { 

        Scanner input = new Scanner(System.in); 
        System.out.print("Enter a year:"); 

        int year = input.nextInt(); //Moved here to get input after the question is asked 

        System.out.print("Enter a month:"); 
        int month = input.nextInt(); //Moved here to get input after the question is asked 

        int days = 0; //changed so that it just initializes the variable to zero
        boolean isLeapYear = (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0); 

        switch (month) { 
            case 1: 
                days = 31; 
                break; 
            case 2: 
                if (isLeapYear) 
                    days = 29; 
                else 
                    days = 28; 
                break; 
            case 3: 
                days = 31; 
                break; 
            case 4: 
                days = 30; 
                break; 
            case 5: 
                days = 31; 
                break; 
            case 6: 
                days = 30; 
                break; 
            case 7: 
                days = 31; 
                break; 
            case 8: 
                days = 31; 
                break; 
            case 9: 
                days = 30; 
                break; 
            case 10: 
                days = 31; 
                break; 
            case 11: 
                days = 30; 
                break; 
            case 12: 
                days = 31; 
                break; 
            default: 
                String response = "Have a Look at what you've done and try again";
                System.out.println(response); 
                System.exit(0); 
        } 

        String response = "There are " + days + " Days in Month " + month + " of Year " + year + ".\n"; 
        System.out.println(response); // new line to show the result to the screen. 
    } 
} //[email protected]
Abhinav S Thakur
fonte
-1
String date = "11-02-2000";
String[] input = date.split("-");
int day = Integer.valueOf(input[0]);
int month = Integer.valueOf(input[1]);
int year = Integer.valueOf(input[2]);
Calendar cal=Calendar.getInstance();
cal.set(Calendar.YEAR,year);
cal.set(Calendar.MONTH,month-1);
cal.set(Calendar.DATE, day);
//since month number starts from 0 (i.e jan 0, feb 1), 
//we are subtracting original month by 1
int days = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
System.out.println(days);
Nagaraju Budigam
fonte
Não há necessidade de responder a uma pergunta que já seja aceita, até que essa resposta seja inválida.
Deepak