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

Como saber quantos dias tem determinado mês do 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 

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 class java.time.YearMonth . Veja o Oracle Tutorial .

 // 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 calendar, 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 

Código para java.util.Calendar

Se você tem que usar java.util.Calendar , eu suspeito que você quer:

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

Código para o Joda Time

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

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

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

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

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

java.time.LocalDate

A partir do Java 1.8, você pode usar o método lengthOfMonth em java.time.LocalDate :

 LocalDate date = LocalDate.of(2010, 1, 19); int days = date.lengthOfMonth(); 
 if (month == 4 || month == 6 || month == 9 || month == 11) daysInMonth = 30; else if (month == 2) daysInMonth = (leapYear) ? 29 : 28; else daysInMonth = 31; 

No Java 8, você pode usar get ValueRange 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.

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; 
 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); } } 
  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 (ie jan 0, feb 1), //we are subtracting original month by 1 int days = cal.getActualMaximum(Calendar.DAY_OF_MONTH); System.out.println(days); 

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

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

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 mês-1 é Por causa do mês leva seu número original do mês, enquanto no método leva argumento como 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; 

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. } } //abhinavsthakur00@gmail.com 
 public class Main { private static LocalDate local=LocalDate.now(); public static void main(String[] args) { int month=local.lengthOfMonth(); System.out.println(month); } } 

O uso da API do Google Calendar desatualizada deve ser evitado.

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

Exemplo de código:

 int year = 2011; int month = 2; YearMonth yearMonth = YearMonth.of(year, month); int lengthOfMonth = yearMonth.lengthOfMonth(); System.out.println(lengthOfMonth); 

Simples assim, não precisa 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; }