Anzahl der Tage in einem bestimmten Monat eines bestimmten Jahres?

158

Woher wissen, wie viele Tage ein bestimmter Monat eines bestimmten Jahres hat?

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
quelle
7
Was genau ist deine Frage?
ShaMan-H_Fel
Zu Ihrer Information, die furchtbar lästig alten Datum Zeitklassen wie java.util.Date, java.util.Calendarund java.text.SimpleDateFormatsind jetzt Erbe , durch die verdrängte java.time Klassen in Java gebaut 8 und höher. Siehe Tutorial von Oracle .
Basil Bourque

Antworten:

367

Java 8 und höher

@ Warren M. Nocos. Wenn Sie versuchen, die neue Datums- und Uhrzeit-API von Java 8 zu verwenden , können Sie java.time.YearMonthclass verwenden. Siehe Oracle Tutorial .

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

Test: Versuchen Sie einen Monat in einem Schaltjahr:

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

Java 7 und früher

Erstellen Sie einen Kalender, legen Sie Jahr und Monat fest und verwenden Sie 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 : Versuchen Sie einen Monat in einem Schaltjahr:

mycal = new GregorianCalendar(2000, Calendar.FEBRUARY, 1);
daysInMonth= mycal.getActualMaximum(Calendar.DAY_OF_MONTH);      // 29
Hemant Metalia
quelle
2
Wie geht das mit der neuen Datums- und Uhrzeit-API von Java 8?
Warren M. Nocos
2
@ WarrenM.Nocos Entschuldigung für die späte Antwort, aber ich war diese Monate nicht aktiv. Bitte überprüfen Sie die Bearbeitung für die Lösung für Java 8.
Hemant Metalia
Wie vor Java 8… Ein Großteil der Funktionen von java.time wird im ThreeTen-Backport- Projekt auf Java 6 und Java 7 zurückportiert . Weiter angepasst für frühere Android im ThreeTenABP- Projekt. Siehe Verwendung von ThreeTenABP… .
Basil Bourque
43

Code für java.util.Calendar

Wenn Sie verwenden müssen java.util.Calendar, vermute ich, dass Sie wollen:

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

Code für Joda Time

Persönlich jedoch würde ich mit vorschlagen Joda Zeit statt java.util.{Calendar, Date}, um mit zu beginnen , in dem Fall , dass Sie verwenden:

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

Beachten Sie, dass es besser ist, die Datums- / Uhrzeit-API abzurufen, die Sie zum Parsen verwenden, anstatt die Zeichenfolgenwerte einzeln zu analysieren. In java.util.*könnten Sie verwenden SimpleDateFormat; in Joda Time würdest du a verwenden DateTimeFormatter.

Jon Skeet
quelle
26

Sie können folgende Calendar.getActualMaximumMethode verwenden:

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

java.time.LocalDate

Ab Java 1.8 können Sie die Methode verwenden lengthOfMonthfür java.time.LocalDate:

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

daysInMonth = 30;

else 

if (month == 2) 

daysInMonth = (leapYear) ? 29 : 28;

else 

daysInMonth = 31;
Zoidbot
quelle
Kalender c = Calendar.getInstance (); c.set (Calendar.DAY_OF_MONTH, c.getActualMaximum (Calendar.DAY_OF_MONTH)); // Sie können das Jahr einstellen, bevor Sie die tatsächliche maximale Coz erhalten, da diese möglicherweise nicht gleich sind. dh Februar 2011 und 2012 ist nicht gleich lang (Schaltjahr)
Rose
5

Dies ist der mathematische Weg:

Für Jahr, Monat (1 bis 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
quelle
3

Ich würde mich für eine Lösung wie diese entscheiden:

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

Wenn der Monat nicht Februar ist (92% der Fälle), hängt er nur vom Monat ab und es ist effizienter, das Jahr nicht einzubeziehen. Auf diese Weise müssen Sie keine Logik aufrufen, um zu wissen, ob es sich um ein Schaltjahr handelt, und Sie müssen das Jahr in 92% der Fälle nicht ermitteln. Und es ist immer noch sauberer und gut lesbarer Code.

Stefan Mondelaers
quelle
1
Ich würde es vorziehen, die gesamte Logik einer bewährten Bibliotheksmethode zu überlassen - ich denke, Sie optimieren sehr vorzeitig, und die Bibliotheksmethoden sind nicht so ineffizient. Immer noch positiv für die Verwendung der modernen Java.time.
Ole VV
@ OleV.V. In vielen Fällen kann es besser sein, die Optimierung einer bewährten Bibliothek zu überlassen. In diesem Fall müssen vorhandene Bibliotheken jedoch einen Monat und ein Jahr vergehen. Das bedeutet, dass ich alles tun muss, um das Jahr zu erhalten, auch wenn die Methode in 92% der Fälle den Wert nicht verwendet. Das ist ein Teil, den ich nicht optimieren kann. Meine Argumentation ähnelt der, warum Sie keinen Methodenaufruf ausführen sollten, um einen Wert zu erhalten, der an einen möglicherweise deaktivierten Logger übergeben werden soll. Auf keinen Fall kann der Logger das optimieren.
Stefan Mondelaers
1

In Java8 können Sie Get ValueRange aus einem Datumsfeld verwenden.

LocalDateTime dateTime = LocalDateTime.now();

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

Auf diese Weise können Sie auf dem Feld parametrieren.

Jamie Lister
quelle
1

So einfach ist das, Sie müssen nichts importieren

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
quelle
Dies ist in Ordnung, wenn Sie keine historischen Daten oder Daten in ferner Zukunft benötigen. Für den Februar von Jahren, die ein Vielfaches von 100, aber kein Vielfaches von 400 sind, wird es falsch sein. Aber ich stimme zu, in den meisten Anwendungen reicht dies aus und es ist effizient.
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
quelle
1
Es ist erwähnenswert, dass es für Android ( android.util.MonthDisplayHelper)
Barbansan
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
quelle
1
Welchen Wert bietet diese Antwort gegenüber den vorhandenen und akzeptierten Antworten? Fügen Sie außerdem eine Erklärung oder einen Bericht zusammen mit Ihrem Code hinzu. StackOverflow ist mehr als eine Snippet-Bibliothek.
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);

    }
}
Nodirbek Hasanboev
quelle
6
Fügen Sie auch einige Erklärungen hinzu.
BlackBeard
1
Willkommen bei Stack Overflow! Während dieses Code-Snippet die Lösung sein kann, hilft das Hinzufügen einer Erklärung wirklich, die Qualität Ihres Beitrags zu verbessern. Denken Sie daran, dass Sie die Frage für Leser in Zukunft beantworten und diese Personen möglicherweise die Gründe für Ihren Codevorschlag nicht kennen.
Yivi
0

Die Verwendung veralteter CalendarAPI sollte vermieden werden.

In Java8 oder einer höheren Version ist dies möglich YearMonth.

Beispielcode:

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

Machen wir es uns so einfach, wenn Sie den Wert von Jahr und Monat nicht fest codieren möchten und den Wert vom aktuellen Datum und der aktuellen Uhrzeit übernehmen möchten:

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
quelle
0

Sie können die Calendar.getActualMaximum-Methode verwenden:

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

Und Monat-1 ist wegen Monat nimmt seine ursprüngliche Anzahl von Monaten, während in Methode wie unten in Calendar.class argumentiert

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

Und das (int-Feld) ist wie folgt.

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

Die folgende Methode gibt Ihnen die Anzahl der Tage in einem bestimmten Monat an

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

Eine optimale und performante Varianz:

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

Weitere Details zum Sprungalgorithmus finden Sie hier

Zauberkünstler
quelle
-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
quelle
-1

Das hat bei mir gut funktioniert.

Dies ist eine Beispielausgabe

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
quelle
-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
quelle
Es ist nicht erforderlich, eine bereits akzeptierte Frage zu beantworten, bis diese Antwort in irgendeiner Weise ungültig ist.
Deepak