2012-02-22 22 views
99

Tengo problemas con el cálculo de cuándo el próximo último día del mes es para una notificación que está programada para enviarse.cálculo del último día del mes

Aquí está mi código:

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

Ésta es la línea causando problemas creo:

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

¿Cómo puedo usar el Calendario para configurar correctamente el último día del mes siguiente a la ¿notificación?

+1

Configúralo al primer día del mes siguiente y luego retrocede un día. – Bill

+0

A [SSCCE] (http://sscce.org) sería más fácil responder a esta pregunta. ¿Qué problema estás viendo en realidad? – DNA

Respuesta

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

Esto devuelve el máximo real para el mes actual. Por ejemplo, es febrero del año bisiesto ahora, por lo que devuelve 29 como int.

+0

gracias, necesito obtener el máximo para el próximo mes, sin embargo, también tiene que funcionar que también puede ser el primer día del mes, ya que esa parte funciona ahora. gracias de nuevo por su tiempo y esfuerzo – OakvilleWork

+3

No es un problema obtener 'ActualMaximum' para cada fecha.Simplemente mueva la instancia del calendario a la fecha requerida antes de llamar a 'getActualMaximum'. La primera fecha se puede obtener mediante 'getActualMinimum()' – AlexR

+0

ok, muchas gracias Alex, así que si deseo pasar la instancia a un mes y averiguar el getActualMaximum para ese mes, ¿cómo lo haría? aplausos – OakvilleWork

1

Mire el método getActualMaximum(int field) del objeto Calendario.

Si configura su objeto Calendario para que esté en el mes para el que está buscando la última fecha, entonces getActualMaximum(Calendar.DAY_OF_MONTH) le dará el último día.

20

Puede establecer el calendario al primero del mes siguiente y luego restar un día.

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

Después de ejecutar este código nextNotifTime se configurará en el último día del mes actual. Tenga en cuenta que si hoy es el último día del mes, el efecto neto de este código es que el objeto Calendario permanece inalterado.

+0

Buena idea, lógica simple ... –

25

Y para conseguir último día como objeto Date:

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

Date lastDayOfMonth = cal.getTime(); 
10

Siguiendo siempre dará resultados adecuados:

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

¿Por qué es necesario? ¿Podrías decirme :) –

+1

Sí, simplemente fallaron las pruebas por esta razón exacta anterior. El problema es que a menos que se establezca DAY_OF_MONTH, se establecerá de manera predeterminada en el actual. – ppearcy

21

java.time

Uso del java.time biblioteca construida en Java 8, puede usar la clase TemporalAdjuster (o 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 

Si es necesario agregar la información de tiempo, es posible utilizar cualquier LocalDate disponible para la conversión LocalDateTime como

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

utilizando la última java.time biblioteca aquí es la mejor solución:

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

alternativa, puede hacer:

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