2012-02-22 3 views
99

У меня возникли проблемы с расчетом того, когда следующий последний месяц месяца отправляется для уведомления, которое планируется отправить.расчет последнего дня месяца

Вот мой код:

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

Это линия вызывает проблемы Я считаю:

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

Как я могу использовать календарь, чтобы правильно установить последний день следующего месяца для уведомление?

+1

Установите его в первый день следующего месяца, а затем откатите один день. – Bill

+0

A [SSCCE] (http://sscce.org) упростит ответ на этот вопрос. Какую проблему вы действительно видите? – DNA

ответ

257
Calendar.getInstance().getActualMaximum(Calendar.DAY_OF_MONTH); 

Это возвращает фактический максимум за текущий месяц. Например, это февраль високосного года, поэтому он возвращает 29 как int.

+0

спасибо, мне нужно получить максимум в течение следующего месяца, но он все равно должен работать, что это может быть и первый день месяца, так как эта часть работает сейчас. Еще раз спасибо за ваше время и силы – OakvilleWork

+3

Невозможно получить 'ActualMaximum' за каждую дату.Просто сверните календарный экземпляр до требуемой даты перед вызовом 'getActualMaximum'. Первая дата может быть получена с помощью 'getActualMinimum()' – AlexR

+0

ok, спасибо, так много, Alex, поэтому, если я хочу перевернуть экземпляр на месяц вперед и узнать getActualMaximum за этот месяц, как бы я это сделал? ура – OakvilleWork

1

Посмотрите на метод Календаря getActualMaximum(int field).

Если вы установили объект Calendar в том месяце, для которого вы ищете последнюю дату, то getActualMaximum(Calendar.DAY_OF_MONTH) предоставит вам последний день.

20

Вы можете установить календарь в первый из следующего месяца, а затем вычесть день.

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

После запуска этого кода nextNotifTime будет установлен в последний день текущего месяца. Имейте в виду, если сегодня последний день месяца, чистый эффект этого кода заключается в том, что объект Calendar остается неизменным.

+0

Хорошая идея, простая логика ... –

25

И получить последний день в качестве объекта Date:

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

Date lastDayOfMonth = cal.getTime(); 
10

После всегда будет давать правильные результаты:

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(); 
+0

Зачем это необходимо? Не могли бы вы рассказать мне :) –

+1

Да, только что закончились тесты по этой точной причине. Проблема в том, что если DAY_OF_MONTH не установлен, он будет по умолчанию текущим. – ppearcy

21

java.time

Использование java.time библиотеки, встроенные в Java 8, вы можете использовать класс TemporalAdjuster (или TemporalAdjusters utility class)

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 

Если вам нужно добавить информацию о времени, вы можете использовать любой доступный LocalDate для преобразования LocalDateTime как

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

Используя новейшие java.time библиотека здесь является лучшим решением:

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

В качестве альтернативы, вы может:

LocalDate endOfMonth = date.withDayOfMonth(date.lengthOfMonth()); 
0
 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)); 
Смежные вопросы