Estou tendo problemas com o cálculo de quando o próximo último dia do mês é para uma notificação que está programada para ser enviada.
Aqui está o meu código:
RecurrenceFrequency recurrenceFrequency = notification.getRecurrenceFrequency();
Calendar nextNotifTime = Calendar.getInstance();
Esta é a linha que causa problemas que acredito:
nextNotifTime.add(recurrenceFrequency.getRecurrencePeriod(),
recurrenceFrequency.getRecurrenceOffset());
Como posso usar o calendário para definir corretamente o último dia do próximo mês para a notificação?
Respostas:
Isso retorna o máximo real para o mês atual. Por exemplo, agora é fevereiro do ano bissexto, retornando 29 como
int
.fonte
ActualMaximum
para cada data. Basta rolar a instância do calendário para a data necessária antes de ligargetActualMaximum
. A primeira data pode ser obtida porgetActualMinimum()
nextNotification.setReadyDateTime(nextNotifTime.getTime());
portanto, não devo fazer issonextNotifTime.roll(Calendar.MONTH, true); nextNotifTime.getActualMaximum(Calendar.DAY_OF_MONTH); nextNotifTime.setTime(Calendar.DAY_OF_MONTH);
:?java.time.temporal.TemporalAdjusters.lastDayOfMonth ()
Usando a
java.time
biblioteca integrada no Java 8, você pode usar aTemporalAdjuster
interface. Encontramos uma implementação pronta para uso naTemporalAdjusters
classe de utilitário:lastDayOfMonth
.Se você precisar adicionar informações de horário, poderá usar qualquer disponível
LocalDate
paraLocalDateTime
conversão, comofonte
LocalDateTime
. Essa classe não possui nenhum conceito de fuso horário ou deslocamento do UTC. Portanto, não é possível determinar quando um determinado dia em um determinado local realmente começa. Essa classe funciona apenas para dias genéricos simples de 24 horas, não para dias do mundo real. Para os dias de reais, especificar um fuso horário:ZonedDateTime zdt = now.atStartOfDay( ZoneId.of( "Asia/Tokyo" ) ) ;
. Alguns dias em alguns locais podem começar em um horário diferente, como 01:00, devido a anomalias como horário de verão (DST).E para obter o último dia como objeto Data:
fonte
Você pode definir o calendário para o primeiro mês que vem e subtrair um dia.
Depois de executar esse código, nextNotifTime será definido como o último dia do mês atual. Lembre-se de que hoje é o último dia do mês, o efeito líquido desse código é que o objeto Calendário permaneça inalterado.
fonte
A seguir, sempre haverá resultados adequados:
fonte
Usar a
java.time
biblioteca mais recente aqui é a melhor solução:Como alternativa, você pode fazer:
fonte
Você também pode usar YearMonth.
Gostar:
Consulte https://docs.oracle.com/javase/8/docs/api/java/time/YearMonth.html#atEndOfMonth--
fonte
Veja o
getActualMaximum(int field)
método do objeto Calendário.Se você definir o objeto Calendário como o mês para o qual está buscando a última data,
getActualMaximum(Calendar.DAY_OF_MONTH)
o último dia será exibido.fonte
fonte
Implementação de extensão de data Kotlin usando
java.util.Calendar
Você pode chamar a
toEndOfMonth
função em cada objeto Date, comoDate().toEndOfMonth()
fonte