saber - ¿Hay alguna manera de tener una duración de Java8 de un año que represente los años bisiestos?
lista de años bisiestos desde 1800 (2)
Necesito la cantidad de días en un año y quería usar la nueva API de Java8.
Sin embargo, no puedo hacer Duration.ofDays(365)
porque no tiene en cuenta los años bisiestos. Y Duration.of(1, ChronoUnit.YEARS)
no vuela debido a java.time.temporal.UnsupportedTemporalTypeException: Unit must not have an estimated duration
Busqué en Período, pero no parece útil para pasar de años a días.
Siento que me estoy perdiendo algo aquí? Podría escribir algo para agregar un día si el año es bisiesto, pero parece que debería poder manejar esto de la caja.
Parece claro que no desea una duración (= entre dos fechas), sino la duración del año de una fecha específica.
LocalDate dateLeap = LocalDate.of(2004, Month.MARCH, 1);
System.out.println("leap year of " + dateLeap
+ " has days: " + dateLeap.lengthOfYear());
El año bisiesto 2004-03-01 tiene días: 366
Java 8 Date & Time es sorprendente completa.
Si quiere decir, del 5 de enero de 2004 al 5 de enero de 2005 = 366 y del 2 de marzo de 2004 al 2 de marzo de 2005 = 365 :
int lengthOfYear(LocalDate date) {
return date.getMonthValue() <= 2
? date.lengthOfYear() // Count Feb in this year
: date.plusYears(1).lengthOfYear(); // Count Feb in next year
}
Explicación: básicamente, la longitud es de 365. Pero si la fecha es> = marzo, se contabiliza el mes de febrero del año siguiente, de lo contrario, el mes de febrero de este año.
plusYears(1)
cuenta que plusYears(1)
no cambiará el DÍA o el MES.
Tampoco se considerarán ni un segundo ni un minuto ni una hora ni un minuto.
Según la respuesta en Obtención de la duración utilizando la nueva API de dateTime que debe usar
Period p = Period.ofYears(1);
Es importante comprender la diferencia entre la Duration
(número exacto de nanosegundos <1 día) y el Period
(variable> 1 día).
Duration
no contabilizará los días bisiestos, el horario de verano o los segundos interminables, por ejemplo, y está destinada a duraciones de menos de un día, como máximo unos pocos días. Así que es mejor si puedes usar Period
lugar.
Debido a que diferentes años tienen diferente número de días, si desea encontrar el número de días en un año, debe especificar de qué año está hablando.
Si desea la cantidad de días en un año específico, puede usar
Year.of(year).length()
Si desea la fecha dentro de un año, puede usar
LocalDate.now().plusYears(1)
o
LocalDate.now().plus(Period.ofYears(1))
Si necesita el número de días entre dos fechas, puede usar
ChronoUnit.DAYS.between(start, end)
Entonces, para encontrar el número de días hasta la fecha dentro de un año, puede usar
LocalDate today = LocalDate.now();
long days = ChronoUnit.DAYS.between(today, today.plusYears(1));
Si desea ver si una membresía de un año sigue siendo válida, puede utilizar
Period membershipLength = Period.ofYears(1);
LocalDate membershipStart = ...;
LocalDate membershipEnd = membershipStart.plus(membershipLength);
LocalDate today = LocalDate.now();
boolean memberShipEnded = today.isAfter(membershipEnd);
boolean membershipValid = !membershipEnded;