Wie erhalte ich mit Joda-Time die Anzahl der Tage innerhalb eines bestimmten Monats?

Lesezeit: 3 Minuten

Benutzer-Avatar
Manuel Araoz

30 days hath September,
   April, June and November,
 All the rest have 31,
   Excepting February alone
(And that has 28 days clear,
   With 29 in each leap year).

Kann ich diese Informationen anagrammatisch erhalten? (Ich meine natürlich nicht das Gedicht)

  • Hmmm … anagrammatisch oder programmatisch?

    – Lambert

    5. Juni 2017 um 20:39 Uhr

Benutzer-Avatar
Eric Robertson

Wenn Sie eine haben DateTime Objekt, das einen Wert im Monat darstellt, dann ist es ziemlich einfach. Du bekommst die dayOfMonth Eigentum daraus DateTime Objekt und erhalten Sie den maximalen Wert der Eigenschaft. Hier ist eine Beispielfunktion:

public static int daysOfMonth(int year, int month) {
  DateTime dateTime = new DateTime(year, month, 14, 12, 0, 0, 000);
  return dateTime.dayOfMonth().getMaximumValue();
}

  • Das hat bei mir nicht funktioniert. getMaximumValue() gibt 31 für November zurück, was natürlich nicht korrekt ist.

    – Chris Gerken

    18. November 2013 um 20:02 Uhr

  • @ChrisGerken: Vielleicht sind deine Monate nullindexiert? Für JODA sollte der Monat ein Wert von 1-12 sein. Wenn Sie 10 für November verwenden, würde JODA das als Oktober sehen und 31 zurückgeben.

    – Eric Robertson

    26. Dezember 2013 um 19:18 Uhr

  • Fast alle meine datumsbezogenen Fehler sind darauf zurückzuführen, dass JODA nicht nullindiziert ist. Es ist schwer zu merken!

    – Chad Bingham

    20. Oktober 2015 um 3:17 Uhr


Benutzer-Avatar
Jon Skeet

Ja, obwohl es nicht so schön ist, wie es sein könnte:

import org.joda.time.*;
import org.joda.time.chrono.*;
import org.joda.time.field.*;

public class Test {
    public static void main(String[] args) {
        GregorianChronology calendar = GregorianChronology.getInstance();
        DateTimeField field = calendar.dayOfMonth();

        for (int i = 1; i < 12; i++) {
            LocalDate date = new LocalDate(2010, i, 1, calendar);
            System.out.println(field.getMaximumValue(date));
        }
    }
}

Beachten Sie, dass ich die Annahme hartcodiert habe, dass es 12 Monate gibt und dass wir an 2010 interessiert sind. Das habe ich ausdrücklich die gregorianische Chronologie gewählt – in anderen Chronologien würden Sie natürlich andere Antworten erhalten. (Und die “12-Monats” -Schleife wäre auch keine gültige Annahme …)

Ich habe für a gegangen LocalDate eher als ein DateTime um den Wert abzurufen, um (wenn auch schwach 🙂 zu betonen, dass der Wert nicht von der Zeitzone abhängt.

Das ist immer noch nicht so einfach, wie es aussieht, wohlgemerkt. Ich weiß nicht sofort, was passiert, wenn Sie eine Chronologie verwenden, um die zu erstellen LocalDate, aber fragen Sie nach dem Maximalwert eines Feldes in einer anderen Chronologie. Ich habe einige Ideen, was könnte passieren, wenn man eine gewisse Menge über Joda Time weiß, aber es ist wahrscheinlich keine gute Idee 🙂

Calendar cal = Calendar.getInstance();
cal.set(Calendar.MONTH, yourMonth);
cal.set(Calendar.YEAR, yourYear);
cal.getActualMaximum(Calendar.DAY_OF_MONTH); // <-- the result!

  • Das ist nicht Jodatime. Das OP hat ausdrücklich darum gebeten.

    – BalusC

    22. September 2010 um 19:46 Uhr

  • Ups. Genau … Ich habe mich auf das Problem konzentriert und den Titel vergessen … Aber wenn das Ergebnis einfach mit der Standard-API erhalten werden kann, ist eine externe API wie JodaTime nutzlos.

    – Benoît Courtine

    22. September 2010 um 20:03 Uhr

  • Ich persönlich würde bleiben Gut weg von java.util.Calendar. Joda Time ist eine weit, weit überlegene API. Wie zuversichtlich sind Sie zum Beispiel, was das bewirken wird, wenn Sie es auf Februar festlegen getInstance kehrt der 31. September zurück? Oh, und vergiss nicht, dass Februar der 1. Monat ist…

    – Jon Skeet

    22. September 2010 um 20:20 Uhr

  • Ich habe Sie über externe APIs gehört, aber das Kalenderpaket von Java ist eine bekannte Belastung. Joda gleitet ohne Probleme hinein.

    – Eric Robertson

    15. März 2011 um 11:25 Uhr

Benutzer-Avatar
David.Chu.ca

Hier ist eine weitere einfache Funktion:

int daysOfMonth(DateTime dt) {
    int month = dt.getMonthOfYear();
    int month2 = month;
    int days = dt.getDay();
    DateTime dt2 = dt;
    while (month == month2 ) {
       days++;
       dt2.addDays(1);
       month2 = dt2.getMonthOfYear();
    }
    return (days - 1);
}

1029780cookie-checkWie erhalte ich mit Joda-Time die Anzahl der Tage innerhalb eines bestimmten Monats?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy