2015-12-03 10 views
6

Chcę uzyskać ostatni dzień poprzedniego miesiąca. Ale to nie robi wydaje się działać:Kalendarz - Pobierz ostatni dzień poprzedniego miesiąca

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

This wyjścia:

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 

Tak robi się w poprzednim miesiącu, to listopad (10), podając, że jest teraz grudzień (11). Ostatni dzień w tym miesiącu jest poprawna, ale wyraźnie, ostatni dzień w poprzednim miesiącu nie było 31, ale 30.

Dlaczego sekund getActualMaximum dać taką samą „Last-dzień-w-miesiąc” jako pierwszy, kiedy robię coś dodać -1?

+0

Może to pomóc niektórym użytkownikom http://stackoverflow.com/a/344400/3701433 – Prudhvi

Odpowiedz

4

Problem w bieżącym kodzie polega na tym, że wielokrotnie wywołuje się metodę Calendar.getInstance(), która zwraca bieżącą datę.

Aby otrzymać Calendar który jest ostatni dzień poprzedniego miesiąca, można mieć:

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

odejmuje jeden miesiąc od bieżącego miesiąca i ustawia dzień miesiąca do jego maksymalnej wartości, uzyskane z getActualMaximum. Zauważ, że jest 0 miesiąc opartą Calendar tak stycznia to faktycznie 0.

1

Spróbuj to, myślę, że będzie rozwiązać problem:

/** 
* 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

Można użyć LOCALDATE jak poniżej: LocalDate.now () .withDayOfMonth (1) .minusDays (1)

Powiązane problemy