Je rencontre des problèmes avec le calcul du moment auquel le prochain dernier jour du mois correspond à une notification qui doit être envoyée.
Voici mon code:
RecurrenceFrequency recurrenceFrequency = notification.getRecurrenceFrequency();
Calendar nextNotifTime = Calendar.getInstance();
C'est la ligne qui cause des problèmes, je crois:
nextNotifTime.add(recurrenceFrequency.getRecurrencePeriod(),
recurrenceFrequency.getRecurrenceOffset());
Comment puis-je utiliser le calendrier pour définir correctement le dernier jour du mois suivant pour la notification?
Réponses:
Cela renvoie le maximum réel pour le mois en cours. Par exemple, c'est février de l'année bissextile maintenant, donc il renvoie 29 comme
int
.la source
ActualMaximum
pour chaque date. Faites simplement rouler l'instance de calendrier à la date requise avant d'appelergetActualMaximum
. La première date peut être obtenue pargetActualMinimum()
nextNotification.setReadyDateTime(nextNotifTime.getTime());
donc je ne devrais pas le faire à la place:nextNotifTime.roll(Calendar.MONTH, true); nextNotifTime.getActualMaximum(Calendar.DAY_OF_MONTH); nextNotifTime.setTime(Calendar.DAY_OF_MONTH);
?java.time.temporal.TemporalAdjusters.lastDayOfMonth ()
En utilisant la
java.time
bibliothèque intégrée à Java 8, vous pouvez utiliser l'TemporalAdjuster
interface. Nous trouvons une implémentation prête à l' emploi dans laTemporalAdjusters
classe utilitaire:lastDayOfMonth
.Si vous avez besoin d'ajouter des informations de temps, vous pouvez utiliser tout disponible
LocalDate
pour laLocalDateTime
conversion commela source
LocalDateTime
. Cette classe n'a aucun concept de fuseau horaire ou de décalage par rapport à UTC. Il ne peut donc pas déterminer à quel moment un jour particulier à un endroit particulier commence réellement. Cette classe ne fonctionne que pour les jours génériques simples de 24 heures, pas les jours du monde réel. Pour les jours réels, spécifiez un fuseau horaire:ZonedDateTime zdt = now.atStartOfDay( ZoneId.of( "Asia/Tokyo" ) ) ;
. Certains jours à certains endroits peuvent commencer à une heure différente, telle que 01:00, en raison d'anomalies telles que l'heure d'été (DST).Et pour obtenir le dernier jour en tant qu'objet Date:
la source
Vous pouvez définir le calendrier sur le premier du mois suivant, puis soustraire un jour.
Après avoir exécuté ce code, nextNotifTime sera défini sur le dernier jour du mois en cours. Gardez à l'esprit que si aujourd'hui est le dernier jour du mois, l'effet net de ce code est que l'objet Calendar reste inchangé.
la source
Ce qui suit donnera toujours des résultats appropriés:
la source
L'utilisation de la dernière
java.time
bibliothèque est la meilleure solution:Alternativement, vous pouvez faire:
la source
Vous pouvez également utiliser YearMonth.
Comme:
Voir https://docs.oracle.com/javase/8/docs/api/java/time/YearMonth.html#atEndOfMonth--
la source
Regardez la
getActualMaximum(int field)
méthode de l'objet Calendar.Si vous définissez votre objet Calendrier pour qu'il soit dans le mois pour lequel vous recherchez la dernière date, alors
getActualMaximum(Calendar.DAY_OF_MONTH)
vous donnera le dernier jour.la source
la source
Implémentation de l'extension de date Kotlin en utilisant
java.util.Calendar
Vous pouvez appeler la
toEndOfMonth
fonction sur chaque objet Date commeDate().toEndOfMonth()
la source