Ho un LocalDate che deve ottenere il primo e l'ultimo giorno del mese. Come lo faccio?
per esempio. 13/2/2014
Ho bisogno di ottenere 1/2/2014
e 28/2/2014
nei formati LocalDate .
Utilizzo di tre classi LocalDate.
Ho un LocalDate che deve ottenere il primo e l'ultimo giorno del mese. Come lo faccio?
per esempio. 13/2/2014
Ho bisogno di ottenere 1/2/2014
e 28/2/2014
nei formati LocalDate .
Utilizzo di tre classi LocalDate.
Risposte:
L'API è stata progettata per supportare una soluzione che corrisponda strettamente ai requisiti aziendali
import static java.time.temporal.TemporalAdjusters.*;
LocalDate initial = LocalDate.of(2014, 2, 13);
LocalDate start = initial.with(firstDayOfMonth());
LocalDate end = initial.with(lastDayOfMonth());
Tuttavia, anche le soluzioni di Jon vanno bene.
YearMonth
Per completezza, e secondo me più elegante, vedi questo uso della YearMonth
classe.
YearMonth month = YearMonth.from(date);
LocalDate start = month.atDay(1);
LocalDate end = month.atEndOfMonth();
Per il primo e l'ultimo giorno del mese corrente, questo diventa:
LocalDate start = YearMonth.now().atDay(1);
LocalDate end = YearMonth.now().atEndOfMonth();
LocalDate
with
metodo?
LocalDate
un'istanza con cui iniziare.
La risposta di Jon Skeets è giusta e ha meritato il mio voto positivo, aggiungendo solo questa soluzione leggermente diversa per completezza:
import static java.time.temporal.TemporalAdjusters.lastDayOfMonth;
LocalDate initial = LocalDate.of(2014, 2, 13);
LocalDate start = initial.withDayOfMonth(1);
LocalDate end = initial.with(lastDayOfMonth());
Se qualcuno viene a cercare il primo giorno del mese precedente e l' ultimo giorno del mese precedente :
public static LocalDate firstDayOfPreviousMonth(LocalDate date) {
return date.minusMonths(1).withDayOfMonth(1);
}
public static LocalDate lastDayOfPreviousMonth(LocalDate date) {
return date.withDayOfMonth(1).minusDays(1);
}
Puoi provare questo per evitare di indicare una data personalizzata e se è necessario visualizzare le date di inizio e fine del mese corrente:
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);
Risultato:
> Start of month: 2019-12-01
> End of month: 2019-12-30
Prova questo:
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);
puoi trovare l'output desiderato ma devi occuparti del parametro true / false per il metodo getLastDayOfMonth
quel parametro denota anno bisestile
getLastDayOfMonth
: vedere la mia risposta per un approccio più semplice.
se vuoi farlo solo con 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);
Solo qui per mostrare la mia implementazione per la soluzione @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
è esattamente la classe sbagliata da usare qui. Stai scartando preziose informazioni sulla zona / offset.
Date
non ha nulla a che fare con la Domanda e dovrebbe essere generalmente evitata.
ZoneId.of("America/La_Paz")
. Per le date odierne darà lo stesso risultato, ma forse non per date storiche o date in un futuro ulteriore.