Wie erhalte ich mit JodaTime das letzte Datum eines bestimmten Monats?

110

Ich muss das erste Datum (als org.joda.time.LocalDate) eines Monats und das letzte bekommen. Das erste zu bekommen ist trivial, aber das letzte zu bekommen scheint eine gewisse Logik zu erfordern, da die Monate unterschiedlich lang sind und die Februar-Länge sogar über Jahre variiert. Gibt es einen Mechanismus, der bereits in JodaTime integriert ist, oder sollte ich ihn selbst implementieren?

Ivan
quelle
2
Nur ein Heads-up, das funktioniert auch mit DateTimeTypen :)
Wikingersteve

Antworten:

222

Wie wäre es mit:

LocalDate endOfMonth = date.dayOfMonth().withMaximumValue();

dayOfMonth()Gibt ein LocalDate.PropertyFeld zurück, das das Feld "Tag des Monats" auf eine Weise darstellt, die den Ursprung kennt LocalDate.

Zufällig wird die withMaximumValue()Methode sogar dokumentiert , um sie für diese bestimmte Aufgabe zu empfehlen:

Dieser Vorgang ist nützlich, um am letzten Tag des Monats ein lokales Datum abzurufen, da die Monatslängen variieren.

LocalDate lastDayOfMonth = dt.dayOfMonth().withMaximumValue();
Jon Skeet
quelle
1
@ Jon Skeet Wie bekomme ich das mit der neuen Datums- und Uhrzeit-API von Java 8?
Warren M. Nocos
5
@ WarrenM.Nocos: Ich würde verwendendt.with(TemporalAdjusters.lastDayOfMonth())
Jon Skeet
4

Eine andere einfache Methode ist folgende:

//Set the Date in First of the next Month:
answer = new DateTime(year,month+1,1,0,0,0);
//Now take away one day and now you have the last day in the month correctly
answer = answer.minusDays(1);
Abraham Maldonado Barrios
quelle
4
Was passiert dann, wenn Ihr Monat = 12 ist?
Jon
Die JodaTime-API ist eine hoch entwickelte, voll geladene und praktische Arbeit. Es gibt viele andere, korrektere Wege, um dies zu erreichen.
aaiezza
Wenn der Monat 12 ist, wissen Sie, dass der letzte Tag 31 ist, oder? Setzen Sie einfach so etwas ein: if (Monat <12) {answer = new DateTime (Jahr, Monat + 1,1,0,0,0); answer = answer.minusDays (1); } else answer = 31;
Abraham Maldonado Barrios
1

Eine alte Frage, aber ein Top-Google-Ergebnis, als ich danach suchte.

Wenn jemand den letzten Tag als intJodaTime benötigt, können Sie dies tun:

public static final int JANUARY = 1;

public static final int DECEMBER = 12;

public static final int FIRST_OF_THE_MONTH = 1;

public final int getLastDayOfMonth(final int month, final int year) {
    int lastDay = 0;

    if ((month >= JANUARY) && (month <= DECEMBER)) {
        LocalDate aDate = new LocalDate(year, month, FIRST_OF_THE_MONTH);

        lastDay = aDate.dayOfMonth().getMaximumValue();
    }

    return lastDay;
}
wiredniko
quelle
1
Ich hätte eine etwas sauberere Antwort vorgezogen, wie: public static int getLastDayOfMonth (int year, int month) {LocalDate date = new LocalDate (Jahr, Monat, 1 Rückgabedatum.dayOfMonth (). GetMaximumValue ();} Aber Ihre Antwort ist super hilfreich, auch wenn etwas überladen, also +1;)
jumps4fun
-1

Mit JodaTime können wir Folgendes tun:

    public static final Integer CURRENT_YEAR = DateTime.now (). getYear ();

    public static final Integer CURRENT_MONTH = DateTime.now (). getMonthOfYear ();

    public static final Integer LAST_DAY_OF_CURRENT_MONTH = DateTime.now ()
            .dayOfMonth (). getMaximumValue ();

    public static final Integer LAST_HOUR_OF_CURRENT_DAY = DateTime.now ()
            .hourOfDay (). getMaximumValue ();

    public static final Integer LAST_MINUTE_OF_CURRENT_HOUR = DateTime.now (). minuteOfHour (). getMaximumValue ();

    public static final Integer LAST_SECOND_OF_CURRENT_MINUTE = DateTime.now (). secondOfMinute (). getMaximumValue ();


    public static DateTime getLastDateOfMonth () {
        Neue DateTime zurückgeben (CURRENT_YEAR, CURRENT_MONTH,
                LAST_DAY_OF_CURRENT_MONTH, LAST_HOUR_OF_CURRENT_DAY,
                LAST_MINUTE_OF_CURRENT_HOUR, LAST_SECOND_OF_CURRENT_MINUTE);
    }}

Wie hier in meinem kleinen Überblick über Github beschrieben: Eine JodaTime- und eine java.util.Date Util-Klasse mit vielen nützlichen Funktionen.

Dassi Orleando
quelle