2015-12-03 2 views
6

Я хочу получить последний день предыдущего месяца. Но это не кажется работать:Календарь - Получить последний день месяца

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

Воспроизводит:

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 

Так это становится в прошлом месяце, это ноябрь (10), давая, что сейчас декабрь (11). Последний день в этом месяце тоже правильно, но ясно, что последний день в предыдущем месяце не 31 было, а 30.

Почему второй getActualMaximum дают тот же самый «последний-день-в-месяц», как первое, когда я добавляю -1 вещь?

+0

Это может помочь некоторым пользователям http://stackoverflow.com/a/344400/3701433 – Prudhvi

ответ

4

Проблема в вашем текущем коде заключается в том, что вы вызываете несколько раз метод Calendar.getInstance(), который возвращает текущую дату.

Чтобы получить Calendar, который в последний день предыдущего месяца, вы можете иметь следующее:

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

вычитает один месяц от текущего месяца и устанавливает день месяца до своего максимального значения, полученных с помощью getActualMaximum. Обратите внимание, что месяц 0 на основе в Calendar так января фактически 0.

1

Попробуйте это, я думаю, что это решит вашу проблему:

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

Вы можете использовать LocalDate, как показано ниже: LocalDate.now () .withDayOfMonth (1) .minusDays (1)

Смежные вопросы