Numero di giorni in particolare mese di un anno particolare?

Come sapere quanti giorni ha un mese particolare di un anno particolare?

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 versioni successive

@ Warren M. Nocos. Se si sta tentando di utilizzare la nuova API Date and Time di Java 8, è ansible utilizzare la class java.time.YearMonth . Vedi Oracle Tutorial .

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

Test: prova un mese in un anno bisestile:

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

Java 7 e precedenti

Crea un calendario, imposta anno e mese e usa 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 

Test : prova un mese in un anno bisestile:

 mycal = new GregorianCalendar(2000, Calendar.FEBRUARY, 1); daysInMonth= mycal.getActualMaximum(Calendar.DAY_OF_MONTH); // 29 

Codice per java.util.Calendar

Se devi usare java.util.Calendar , sospetto che tu voglia:

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

Codice per Joda Time

Personalmente, tuttavia, suggerirei di utilizzare Joda Time invece di java.util.{Calendar, Date} per iniziare, nel qual caso potresti usare:

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

Nota che piuttosto di analizzare singolarmente i valori della stringa, sarebbe meglio ottenere qualsiasi API di data / ora che stai usando per analizzarla. In java.util.* Potresti usare SimpleDateFormat ; in Joda Time useresti un DateTimeFormatter .

Puoi utilizzare il metodo 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

Da Java 1.8, è ansible utilizzare il metodo lengthOfMonth su 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; 

In Java8 puoi usare ValueRange da un campo di una data.

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

Questo ti permette di parametrizzare sul campo.

Questo è il modo matematico:

Per anno, mese (da 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); 

Il seguente metodo ti fornirà il numero di giorni in un determinato mese

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

Puoi utilizzare il metodo Calendar.getActualMaximum:

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

E mese-1 è perché il mese prende il suo numero originale di mese mentre nel metodo prende argomento come di seguito in Calendar.class

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

E il campo (int) è come di seguito.

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

Questo ha funzionato bene per me.

Questa è un’uscita di esempio

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

L’uso di API di Calendar obsolete dovrebbe essere evitato.

In Java8 o versione successiva, questo può essere fatto con YearMonth .

Codice di esempio:

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

Semplice come quello, non c’è bisogno di importare nulla

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