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 ser enviada.
Aquí está mi código:
RecurrenceFrequency recurrenceFrequency = notification.getRecurrenceFrequency();
Calendar nextNotifTime = Calendar.getInstance();
Esta es la línea que causa problemas que creo:
nextNotifTime.add(recurrenceFrequency.getRecurrencePeriod(),
recurrenceFrequency.getRecurrenceOffset());
¿Cómo puedo usar el Calendario para configurar correctamente el último día del próximo mes para la notificación?
Respuestas:
Esto devuelve el máximo real para el mes actual. Por ejemplo, ahora es febrero del año bisiesto, por lo que devuelve 29 como
int
.fuente
ActualMaximum
para cada fecha. Simplemente pase la instancia del calendario a la fecha requerida antes de llamargetActualMaximum
. La primera fecha se puede obtener porgetActualMinimum()
nextNotification.setReadyDateTime(nextNotifTime.getTime());
por lo tanto, ¿no debería hacer esto en su lugarnextNotifTime.roll(Calendar.MONTH, true); nextNotifTime.getActualMaximum(Calendar.DAY_OF_MONTH); nextNotifTime.setTime(Calendar.DAY_OF_MONTH);
:?java.time.temporal.TemporalAdjusters.lastDayOfMonth ()
Usando la
java.time
biblioteca integrada en Java 8, puede usar laTemporalAdjuster
interfaz. Nos encontramos con una aplicación lista para su uso en laTemporalAdjusters
clase de utilidad:lastDayOfMonth
.Si necesita agregar información de tiempo, puede usar cualquier disponible
LocalDate
para laLocalDateTime
conversión comofuente
LocalDateTime
. Esa clase carece de cualquier concepto de zona horaria o desplazamiento desde UTC. Por lo tanto, no puede determinar cuándo comienza un día en particular en un lugar en particular. Esa clase solo funciona para días genéricos de 24 horas, no para días del mundo real. Para los días reales, especifique una zona horaria:ZonedDateTime zdt = now.atStartOfDay( ZoneId.of( "Asia/Tokyo" ) ) ;
. Algunos días en algunos lugares pueden comenzar a una hora diferente, como 01:00, debido a anomalías como el horario de verano (DST).Y para obtener el último día como objeto Fecha:
fuente
Puede configurar el calendario al primero del próximo mes y luego restar un día.
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 sin cambios.
fuente
Lo siguiente siempre dará resultados adecuados:
fuente
Usar la última
java.time
biblioteca aquí es la mejor solución:Alternativamente, puedes hacer:
fuente
También puedes usar YearMonth.
Me gusta:
Ver https://docs.oracle.com/javase/8/docs/api/java/time/YearMonth.html#atEndOfMonth--
fuente
Mira el
getActualMaximum(int field)
método del objeto Calendario.Si configura su objeto Calendario para estar en el mes para el que está buscando la última fecha,
getActualMaximum(Calendar.DAY_OF_MONTH)
le dará el último día.fuente
fuente
Implementación de extensión de fecha Kotlin usando
java.util.Calendar
Puede llamar a la
toEndOfMonth
función en cada objeto Fecha comoDate().toEndOfMonth()
fuente