java - ejemplo - cálculo del último día del mes
jdatechooser netbeans ejemplo (8)
java.time
Usando la biblioteca java.time
integrada en Java 8, puede usar la clase TemporalAdjuster
(o la clase de utilidad TemporalAdjusters
)
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 necesita agregar información de tiempo, puede usar cualquier conversión disponible de LocalDate a LocalDateTime como
lastDay.atStartOfDay(); //2015-11-30T00:00
Estoy teniendo 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.
Aquí está mi código:
RecurrenceFrequency recurrenceFrequency = notification.getRecurrenceFrequency();
Calendar nextNotifTime = Calendar.getInstance();
Esta es la línea que causa problemas, creo:
nextNotifTime.add(recurrenceFrequency.getRecurrencePeriod(),
recurrenceFrequency.getRecurrenceOffset());
¿Cómo puedo usar el Calendario para configurar correctamente el último día del mes siguiente para la notificación?
Mire el 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, getActualMaximum(Calendar.DAY_OF_MONTH)
le dará el último día.
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 establecerá 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.
Seguir siempre dará los 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();
Usar la última biblioteca java.time
aquí es la mejor solución:
LocalDate date = LocalDate.now();
LocalDate endOfMonth = date.with(TemporalAdjusters.lastDayOfMonth());
Alternativamente, puedes hacer:
LocalDate endOfMonth = date.withDayOfMonth(date.lengthOfMonth());
Y para obtener el último día como objeto Fecha:
Calendar cal = Calendar.getInstance();
cal.set(Calendar.DATE, cal.getActualMaximum(Calendar.DATE));
Date lastDayOfMonth = cal.getTime();
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));
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
.