Tengo un objeto LocalDateTime. Quiero obtener la última fecha del mes. Entonces, si localDateTime apunta a la fecha actual del 29 de octubre. Quiero convertirlo al 31 de octubre.
¿Hay una manera limpia y fácil de hacerlo?
Mis pensamientos:
Una forma sería obtener el mes y luego hacer una declaración de cambio. Pero ese sería el enfoque largo y tedioso. No estoy seguro si hay un método incorporado
hacer lo mismo
Utilice YearMonth.atEndOfMonth
LocalDate date = LocalDate.now(); YearMonth month = YearMonth.from(date); LocalDate end = month.atEndOfMonth();import java.time.LocalDateTime; import java.time.temporal.TemporalAdjusters; public class Main { public static void main(String args[]) { LocalDateTime a = LocalDateTime.of(2021, 10, 29, 0, 0); LocalDateTime b = a.with(TemporalAdjusters.lastDayOfMonth()); System.out.println(a); System.out.println(b); } }Tu preguntaste:
¿Cómo agrego endTime of day a localDateTime. Veo una opción llamada LocalTime.MAX pero agrega .99999 final
No use LocalDateTime si está rastreando momentos, puntos específicos en la línea de tiempo. Esa clase carece del contexto de una zona horaria o un desplazamiento desde UTC. Por momentos, use Instant , OffsetDateTime o ZonedDateTime .
Representa un mes completo con YearMonth .
No debes intentar concretar el último momento del mes. Ese último momento es infinitamente divisible. En general, la mejor manera de definir un lapso de tiempo es el enfoque Semiabierto en lugar de Completamente cerrado. En Half-Open, el comienzo es inclusivo mientras que el final es exclusivo .
Entonces, un día comienza con el primer momento del día y se extiende hasta, pero no incluye, el primer momento del día siguiente . Un mes comienza con el primer momento del primer día del mes y termina, pero no incluye, el primer momento del primero del mes siguiente .
ZoneId z = ZoneId.of( "Asia/Tokyo" ) ; YearMonth currentMonth = YearMonth.now( z ) ; YearMonth followingMonth = currentMonth.plusMonths( 1 ) ; ZonedDateTime start = currentMonth.atDay( 1 ).atStartOfDay( z ) ; ZonedDateTime end = followingMonth.atDay( 1 ).atStartOfDay( z ) ; Para representar ese lapso de tiempo, agregue la biblioteca ThreeTen-Extra a su proyecto. Utilice la clase Interval con sus prácticos métodos de comparación, como abuts , overlaps y contains .
org.threeten.extra.Interval interval = Interval.of( start.toInstant() , end.toInstant() ) ;