J'ai un LocalDate qui doit obtenir le premier et le dernier jour du mois. Comment je fais ça?
par exemple. 13/2/2014
J'ai besoin d'obtenir 1/2/2014
et 28/2/2014
dans les formats LocalDate .
Utilisation de trois classes LocalDate.
J'ai un LocalDate qui doit obtenir le premier et le dernier jour du mois. Comment je fais ça?
par exemple. 13/2/2014
J'ai besoin d'obtenir 1/2/2014
et 28/2/2014
dans les formats LocalDate .
Utilisation de trois classes LocalDate.
Réponses:
L'API a été conçue pour prendre en charge une solution qui correspond étroitement aux exigences de l'entreprise
import static java.time.temporal.TemporalAdjusters.*;
LocalDate initial = LocalDate.of(2014, 2, 13);
LocalDate start = initial.with(firstDayOfMonth());
LocalDate end = initial.with(lastDayOfMonth());
Cependant, les solutions de Jon sont également très bien.
YearMonth
Pour être complet, et plus élégant à mon avis, voyez cette utilisation de la YearMonth
classe.
YearMonth month = YearMonth.from(date);
LocalDate start = month.atDay(1);
LocalDate end = month.atEndOfMonth();
Pour le premier et le dernier jour du mois en cours, cela devient:
LocalDate start = YearMonth.now().atDay(1);
LocalDate end = YearMonth.now().atEndOfMonth();
LocalDate
with
méthode?
LocalDate
instance pour commencer.
La réponse de Jon Skeets est juste et a mérité mon vote favorable, en ajoutant simplement cette solution légèrement différente pour être complète:
import static java.time.temporal.TemporalAdjusters.lastDayOfMonth;
LocalDate initial = LocalDate.of(2014, 2, 13);
LocalDate start = initial.withDayOfMonth(1);
LocalDate end = initial.with(lastDayOfMonth());
Si quelqu'un vient chercher le premier jour du mois précédent et le dernier jour du mois précédent :
public static LocalDate firstDayOfPreviousMonth(LocalDate date) {
return date.minusMonths(1).withDayOfMonth(1);
}
public static LocalDate lastDayOfPreviousMonth(LocalDate date) {
return date.withDayOfMonth(1).minusDays(1);
}
LocalDate monthstart = LocalDate.of(year,month,1);
LocalDate monthend = monthstart.plusDays(monthstart.lengthOfMonth()-1);
Vous pouvez essayer ceci pour éviter d'indiquer une date personnalisée et s'il est nécessaire d'afficher les dates de début et de fin du mois en cours:
LocalDate start = LocalDate.now().minusDays(LocalDate.now().getDayOfMonth()-1);
LocalDate end = LocalDate.now().minusDays(LocalDate.now().getDayOfMonth()).plusMonths(1);
System.out.println("Start of month: " + start);
System.out.println("End of month: " + end);
Résultat:
> Start of month: 2019-12-01
> End of month: 2019-12-30
Essaye ça:
LocalDate initial = LocalDate.of(2014, 2, 13);
LocalDate start = initial.withDayOfMonth(1);
LocalDate end = initial.withDayOfMonth(initial.getMonthOfYear().getLastDayOfMonth(false));
System.out.println(start);
System.out.println(end);
vous pouvez trouver la sortie désirée mais vous devez prendre soin du paramètre true / false pour la méthode getLastDayOfMonth
ce paramètre indique une année bissextile
getLastDayOfMonth
- voir ma réponse pour une approche plus simple.
si vous voulez le faire uniquement avec la classe LocalDate:
LocalDate initial = LocalDate.of(2014, 2, 13);
LocalDate start = LocalDate.of(initial.getYear(), initial.getMonthValue(),1);
// Idea: the last day is the same as the first day of next month minus one day.
LocalDate end = LocalDate.of(initial.getYear(), initial.getMonthValue(), 1).plusMonths(1).minusDays(1);
Juste ici pour montrer mon implémentation pour la solution @herman
ZoneId americaLaPazZone = ZoneId.of("UTC-04:00");
static Date firstDateOfMonth(Date date) {
LocalDate localDate = convertToLocalDateWithTimezone(date);
YearMonth baseMonth = YearMonth.from(localDate);
LocalDateTime initialDate = baseMonth.atDay(firstDayOfMonth).atStartOfDay();
return Date.from(initialDate.atZone(americaLaPazZone).toInstant());
}
static Date lastDateOfMonth(Date date) {
LocalDate localDate = convertToLocalDateWithTimezone(date);
YearMonth baseMonth = YearMonth.from(localDate);
LocalDateTime lastDate = baseMonth.atEndOfMonth().atTime(23, 59, 59);
return Date.from(lastDate.atZone(americaLaPazZone).toInstant());
}
static LocalDate convertToLocalDateWithTimezone(Date date) {
return LocalDateTime.from(date.toInstant().atZone(americaLaPazZone)).toLocalDate();
}
LocalDateTime
est exactement la mauvaise classe à utiliser ici. Vous supprimez des informations de zone / offset précieuses.
Date
n'a rien à voir avec la question, et devrait généralement être évitée.
ZoneId.of("America/La_Paz")
. Pour les dates actuelles, cela donnera le même résultat, mais peut-être pas pour des dates historiques ou des dates dans un futur futur.