Tengo un LocalDate que debe obtener el primer y último día del mes. ¿Cómo puedo hacer eso?
p.ej. 13/2/2014
Necesito obtener 1/2/2014
y 28/2/2014
en formatos LocalDate .
Usando la clase Threeten LocalDate.
Tengo un LocalDate que debe obtener el primer y último día del mes. ¿Cómo puedo hacer eso?
p.ej. 13/2/2014
Necesito obtener 1/2/2014
y 28/2/2014
en formatos LocalDate .
Usando la clase Threeten LocalDate.
Respuestas:
La API se diseñó para admitir una solución que se ajusta a los requisitos comerciales.
import static java.time.temporal.TemporalAdjusters.*;
LocalDate initial = LocalDate.of(2014, 2, 13);
LocalDate start = initial.with(firstDayOfMonth());
LocalDate end = initial.with(lastDayOfMonth());
Sin embargo, las soluciones de Jon también están bien.
YearMonth
Para completar, y más elegante en mi opinión, vea este uso de YearMonth
clase.
YearMonth month = YearMonth.from(date);
LocalDate start = month.atDay(1);
LocalDate end = month.atEndOfMonth();
Para el primer y último día del mes actual, esto se convierte en:
LocalDate start = YearMonth.now().atDay(1);
LocalDate end = YearMonth.now().atEndOfMonth();
LocalDate
with
método?
LocalDate
instancia para comenzar.
La respuesta de Jon Skeets es correcta y ha merecido mi voto a favor, simplemente agregando esta solución ligeramente diferente para completar:
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 alguien viene buscando el primer día del mes anterior y el último día del mes anterior :
public static LocalDate firstDayOfPreviousMonth(LocalDate date) {
return date.minusMonths(1).withDayOfMonth(1);
}
public static LocalDate lastDayOfPreviousMonth(LocalDate date) {
return date.withDayOfMonth(1).minusDays(1);
}
Puede intentar esto para evitar indicar una fecha personalizada y si es necesario mostrar las fechas de inicio y finalización del mes actual:
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);
Resultado:
> Start of month: 2019-12-01
> End of month: 2019-12-30
Prueba esto:
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);
puede encontrar la salida deseada pero debe cuidar el parámetro true / false para el método getLastDayOfMonth
ese parámetro denota año bisiesto
getLastDayOfMonth
; vea mi respuesta para un enfoque más simple.
si desea hacerlo solo con la clase 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 aquí para mostrar mi implementación para la solución @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
es exactamente la clase incorrecta para usar aquí. Está descartando información valiosa de zona / compensación.
Date
no tiene nada que ver con la Pregunta y, en general, debería evitarse.
ZoneId.of("America/La_Paz")
. Para las fechas actuales dará el mismo resultado, pero tal vez no para fechas históricas o fechas en un futuro posterior.