Numero di giorni in un determinato mese di un determinato anno?


158

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

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

7
Qual è esattamente la tua domanda?
ShaMan-H_Fel

Cordiali saluti, le vecchie classi data-ora terribilmente fastidiose come java.util.Date, java.util.Calendare java.text.SimpleDateFormatora sono legacy , soppiantate dalle classi java.time integrate in Java 8 e versioni successive. Vedi Tutorial di Oracle .
Basil Bourque,

Risposte:


368

Java 8 e versioni successive

@Warren M. Nocos. Se si sta tentando di utilizzare la nuova API Data e ora di Java 8 , è possibile utilizzare la java.time.YearMonthclasse. Vedi Tutorial Oracle .

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

2
Come eseguire questa operazione sulla nuova API Data e ora di Java 8?
Warren M. Nocos,

2
@ WarrenM.Nocos mi dispiace per la risposta in ritardo, ma non ero attivo in questi mesi. controlla la modifica per la soluzione per java 8.
Hemant Metalia

Come prima di Java 8 ... Gran parte della funzionalità java.time è trasferita su Java 6 e Java 7 nel progetto ThreeTen-Backport . Ulteriore adattamento per Android precedente nel progetto ThreeTenABP . Vedi Come usare ThreeTenABP… .
Basil Bourque,

43

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 usare Joda Time invece di java.util.{Calendar, Date}iniziare, nel qual caso potresti usare:

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

Si noti che anziché analizzare i valori delle stringhe singolarmente, sarebbe meglio ottenere qualsiasi API data / ora che si sta utilizzando per analizzarlo. In java.util.*te potresti usare SimpleDateFormat; in Joda Time useresti a DateTimeFormatter.


27

Puoi usare il Calendar.getActualMaximummetodo:

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


7
if (month == 4 || month == 6 || month == 9 || month == 11)

daysInMonth = 30;

else 

if (month == 2) 

daysInMonth = (leapYear) ? 29 : 28;

else 

daysInMonth = 31;

Calendario c = Calendar.getInstance (); c.set (Calendar.DAY_OF_MONTH, c.getActualMaximum (Calendar.DAY_OF_MONTH)); // puoi impostare l'anno prima di ottenere il coz massimo effettivo che potrebbero non essere gli stessi. cioè il febbraio e il 2012 non sono della stessa lunghezza (anno bisestile)
Rose,

5

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;

3

Vorrei una soluzione come questa:

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 il mese non è febbraio (92% dei casi), dipende solo dal mese ed è più efficiente non coinvolgere l'anno. In questo modo, non è necessario chiamare la logica per sapere se si tratta di un anno bisestile e non è necessario ottenere l'anno nel 92% dei casi. Ed è ancora un codice pulito e molto leggibile.


1
Preferirei lasciare l'intera logica a un metodo di libreria collaudato - penso che tu stia ottimizzando molto prematuramente, e i metodi di libreria non sono così inefficienti. Ancora votato per l'uso del moderno java.time.
Ole VV,

@ OleV.V. È vero, in molti casi lasciare l'ottimizzazione a una libreria collaudata può essere migliore. Ma, in questo caso, le librerie esistenti dovranno passare un mese e un anno. Ciò significa che devo comunque fare tutto il necessario per ottenere l'anno, anche se il metodo non utilizzerà il valore nel 92% dei casi. Quindi, questa è una parte che non può ottimizzare per me. Il mio ragionamento è simile al motivo per cui non dovresti fare una chiamata di metodo per ottenere un valore da passare a un logger che potrebbe essere disabilitato. In nessun modo il logger può ottimizzarlo.
Stefan Mondelaers,

1

In Java8 è possibile utilizzare get ValueRange da un campo di una data.

LocalDateTime dateTime = LocalDateTime.now();

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

Ciò consente di parametrizzare sul campo.


1

Semplice come quello, non è necessario 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;
}

Va bene, se non hai bisogno di date storiche o date in un futuro molto lontano. Per febbraio di anni che sono multipli di 100 ma non multipli di 400, sarà sbagliato. Ma sono d'accordo, nella maggior parte delle applicazioni lo farà ed è efficiente.
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();

1
Vale la pena notare che è per 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);


    }

}

1
Quale valore fornisce questa risposta rispetto alle risposte esistenti e accettate? Inoltre, aggiungi qualche spiegazione o narrativa insieme al tuo codice. StackOverflow è più di una libreria di frammenti.
Basil Bourque,

0
public class Main {

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

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

    }
}

6
Aggiungi anche alcune spiegazioni.
BlackBeard

1
Benvenuto in Stack Overflow! Sebbene questo frammento di codice possa essere la soluzione, includendo una spiegazione aiuta davvero a migliorare la qualità del tuo post. Ricorda che stai rispondendo alla domanda per i lettori in futuro e quelle persone potrebbero non conoscere i motivi del tuo suggerimento sul codice.
yivi,

0

L'uso di CalendarAPI obsolete dovrebbe essere evitato.

In Java8 o versione successiva, è possibile farlo 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);

Call requires API level 26 (current min is 21): java.time.YearMonth#lengthOfMonth
Vlad

0

Rendiamolo semplice se non vuoi codificare il valore di anno e mese e vuoi prendere il valore dalla data e ora correnti:

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

0

È possibile 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 il mese-1 è A causa del mese prende il suo numero originale di mese mentre nel metodo prende argomento come sotto in Calendar.class

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

E il (campo int) è come sotto.

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

0

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

0

Una varianza ottimale e performante:

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

Per maggiori dettagli sull'algoritmo del salto, controlla qui


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

-1

Questo ha funzionato bene per me.

Questo è un output 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

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

Non è necessario rispondere a una domanda già accettata, fino a quando tale risposta non è valida in alcun modo.
Deepak,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.