2015-12-03 13 views
6

Ich möchte den letzten Tag des vorherigen Monats abrufen. Aber das scheint nicht zu funktionieren:Kalender - Letzten Tag des vorherigen Monats abrufen

Calendar cal = Calendar.getInstance(); 
Integer lastDay = cal.getInstance().getActualMaximum(cal.DAY_OF_MONTH); 

cal.add(Calendar.MONTH, -1); 

Integer prevMonth = cal.get(Calendar.MONTH); 
Integer prevMonthYear = cal.get(Calendar.YEAR); 
Integer lastDayPrevMonth = cal.getInstance().getActualMaximum(cal.DAY_OF_MONTH); 

System.out.println("Previous month was: " + prevMonth + "-" + prevMonthYear); 
System.out.println("Last day in previous month was: " + lastDayPrevMonth); 
System.out.println("Last day in this month is: " + lastDay); 

Diese Ausgänge:

I/System.out﹕: Previous month was 10-2015 
I/System.out﹕: Last day in previous month was 31 
I/System.out﹕: Last day in this month is 31 

es also im letzten Monat bekommen, das ist November (10), mit, dass es jetzt Dezember (11) ist. Letzter Tag in diesem Monat auch richtig, aber klar, am letzten Tag im vergangenen Monat war nicht 31, sondern 30

Warum die zweiten getActualMaximum den gleichen „liest-Tag-in-Monat“ als ersten geben, wenn ich die add -1 Sache mache?

+0

Dies könnte einigen Benutzern helfen http://stackoverflow.com/a/344400/3701433 – Prudhvi

Antwort

4

Das Problem in Ihrem aktuellen Code ist, dass Sie mehrmals die Methode Calendar.getInstance() aufrufen, die das aktuelle Datum zurückgibt.

Um ein Calendar zu erhalten, die am letzten Tag des Vormonats ist, können Sie die folgenden haben:

public static void main(String... args) { 
    Calendar cal = Calendar.getInstance(); 
    cal.add(Calendar.MONTH, -1); 
    cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH)); 

    System.out.println(cal.get(Calendar.MONTH)); 
    System.out.println(cal.get(Calendar.DAY_OF_MONTH)); 
} 

Es subtrahiert einen Monat ab dem aktuellen Monat und setzt den Tag des Monats auf seinen Maximalwert, erhalten mit getActualMaximum. Beachten Sie, dass der Monat ist 0-basiert in Calendar so Januar tatsächlich ist 0.

1

die Sie interessieren, ich denke, es Ihr Problem lösen:

/** 
* Returns previous month date in string format 
* @param date 
* @return 
*/ 
private static String getPreviousMonthDate(Date date){ 
    final SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy"); 

    Calendar cal = Calendar.getInstance(); 
    cal.setTime(date); 
    cal.set(Calendar.DAY_OF_MONTH, 1); 
    cal.add(Calendar.DATE, -1); 

    Date preMonthDate = cal.getTime(); 
    return format.format(preMonthDate); 
} 

/** 
* Returns previous to previous month date in string format 
* @param date 
* @return 
*/ 
private static String getPreToPreMonthDate(Date date){ 
    final SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy"); 

    Calendar cal = Calendar.getInstance(); 
    cal.setTime(date); 
    cal.add(Calendar.MONTH, -1); 
    cal.set(Calendar.DAY_OF_MONTH,1); 
    cal.add(Calendar.DATE, -1); 

    Date preToPreMonthDate = cal.getTime(); 
    return format.format(preToPreMonthDate); 
} 
0

Sie können LOCALDATE verwenden, wie unten: LocalDate.now () .withDayOfMonth (1) .minusDays (1)

Verwandte Themen