it-swarm.com.de

letzte Tag des Monats Berechnung

Ich habe Probleme mit der Berechnung, wann der nächste letzte Tag des Monats für eine Benachrichtigung vorgesehen ist, die gesendet werden soll.

Hier ist mein Code:

RecurrenceFrequency recurrenceFrequency = notification.getRecurrenceFrequency();
Calendar nextNotifTime = Calendar.getInstance();

Dies ist die Zeile, die meiner Meinung nach Probleme verursacht:

nextNotifTime.add(recurrenceFrequency.getRecurrencePeriod(), 
                  recurrenceFrequency.getRecurrenceOffset());

Wie kann ich den Kalender verwenden, um den letzten Tag des nächsten Monats für die Benachrichtigung korrekt festzulegen?

123
OakvilleWork
Calendar.getInstance().getActualMaximum(Calendar.DAY_OF_MONTH);

Dies gibt das tatsächliche Maximum für den aktuellen Monat zurück. Zum Beispiel ist jetzt der Februar des Schaltjahres und es wird 29 als int zurückgegeben.

312
AlexR

Java.time

Verwendung der Java.time Bibliothek eingebaut in Java 8, Sie können die TemporalAdjuster Klasse (oder die TemporalAdjusters Utility-Klasse ) verwenden

import Java.time.LocalDate;
import Java.time.temporal.TemporalAdjusters;

LocalDate now = LocalDate.now(); //2015-11-23
LocalDate lastDay = now.with(TemporalAdjusters.lastDayOfMonth()); //2015-11-30

Wenn Sie Zeitinformationen hinzufügen müssen, können Sie eine beliebige verfügbare Konvertierung von LocalDate in LocalDateTime verwenden, z

lastDay.atStartOfDay(); //2015-11-30T00:00
45
Przemek

Und um den letzten Tag als Datumsobjekt zu erhalten:

Calendar cal = Calendar.getInstance();
cal.set(Calendar.DATE, cal.getActualMaximum(Calendar.DATE));

Date lastDayOfMonth = cal.getTime();
32
yetAnotherSE

Sie können den Kalender auf den ersten des nächsten Monats einstellen und dann einen Tag abziehen.

Calendar nextNotifTime = Calendar.getInstance();
nextNotifTime.add(Calendar.MONTH, 1);
nextNotifTime.set(Calendar.DATE, 1);
nextNotifTime.add(Calendar.DATE, -1);

Nach dem Ausführen dieses Codes wird nextNotifTime auf den letzten Tag des aktuellen Monats gesetzt. Denken Sie daran, dass das Calendar-Objekt unverändert bleibt, wenn heute der letzte Tag des Monats ist.

20
Mike Deck

Folgendes liefert immer die richtigen Ergebnisse:

    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.MONTH, ANY_MONTH);
    cal.set(Calendar.YEAR, ANY_YEAR);
    cal.set(Calendar.DAY_OF_MONTH, 1);// This is necessary to get proper results
    cal.set(Calendar.DATE, cal.getActualMaximum(Calendar.DATE));
    cal.getTime();
15

Verwenden des neuesten Java.time Bibliothek hier ist die beste Lösung:

LocalDate date = LocalDate.now();
LocalDate endOfMonth = date.with(TemporalAdjusters.lastDayOfMonth());

Alternativ können Sie Folgendes tun:

LocalDate endOfMonth = date.withDayOfMonth(date.lengthOfMonth());
7
satnam

Sehen Sie sich die getActualMaximum(int field) -Methode des Calendar-Objekts an.

Wenn Sie Ihr Kalenderobjekt auf den Monat einstellen, für den Sie das letzte Datum suchen, gibt getActualMaximum(Calendar.DAY_OF_MONTH) den letzten Tag an.

2
Bruno
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
        Date date = sdf.parse("11/02/2016");

        Calendar calendar = Calendar.getInstance();  
        calendar.setTime(date);  

        System.out.println("First Day Of Month : " + calendar.getActualMinimum(Calendar.DAY_OF_MONTH));  
        System.out.println("Last Day of Month  : " + calendar.getActualMaximum(Calendar.DAY_OF_MONTH)); 
2
Kishore Kumar

Sie können auch YearMonth verwenden.

Mögen:

YearMonth.of(2019,7).atEndOfMonth()
YearMonth.of(2019,7).atDay(1)

Siehe https://docs.Oracle.com/javase/8/docs/api/Java/time/YearMonth.html#atEndOfMonth--

1
EduardoMPinto

Implementierung der Kotlin-Datumserweiterung mit Java.util.Calendar

fun Date.toEndOfMonth(): Date {
    return Calendar.getInstance().apply {
        time = [email protected]
    }.toEndOfMonth().time
}

fun Calendar.toEndOfMonth(): Calendar {
    set(Calendar.DAY_OF_MONTH, getActualMaximum(Calendar.DAY_OF_MONTH))
    return this
}

Sie können die Funktion toEndOfMonth für jedes Datumsobjekt wie Date().toEndOfMonth() aufrufen.

0
gokhan