2015-04-27 3 views
29

Мне нужно количество дней в году, и я хотел использовать новое время api Java8.Есть ли способ иметь продолжительность Java8 в течение одного года, которая учитывает високосные годы?

Однако, я не могу сделать Duration.ofDays(365), потому что он не учитывает високосные годы. И Duration.of(1, ChronoUnit.YEARS) не летает из-за java.time.temporal.UnsupportedTemporalTypeException: Unit must not have an estimated duration

Я просмотрел Период, но он не кажется полезным для перехода от нескольких лет к дням.

Я чувствую, что здесь что-то отсутствует? Я мог бы написать что-то, чтобы добавить день, если год является високосным годом, но похоже, что я смогу справиться с этим из коробки.

+2

Возможный дубликат [Получение продолжительности с использованием нового API-интерфейса dateTime] (http://stackoverflow.com/questions/26454129/getting-duration-using-the-new-datetime-api) –

ответ

38

В соответствии с ответом на Getting Duration using the new dateTime API вы должны использовать

Period p = Period.ofYears(1); 

Важно понимать разницу между Duration (точное количество наносекунд < 1 день) и Period (переменная> 1 день).

Duration не учитывает високосные дни, летнее время или секунды прыжка, например, и рассчитан на длительность менее суток, максимум через несколько дней. Так что это действительно лучше, если вы можете использовать Period вместо этого.

Поскольку разные годы имеют разное количество дней, если вы хотите найти количество дней в году, вам нужно указать, в каком году вы говорите.

Если вы хотите, количество дней в конкретном году, вы можете использовать

Year.of(year).length() 

Если вы хотите, дата истечения одного года с этого момента, вы можете использовать

LocalDate.now().plusYears(1) 

или

LocalDate.now().plus(Period.ofYears(1)) 

Если вам нужно количество дней между двумя датами, вы можете использовать

ChronoUnit.DAYS.between(start, end) 

Так, чтобы найти количество дней до даты, через год, вы можете использовать

LocalDate today = LocalDate.now(); 
long days = ChronoUnit.DAYS.between(today, today.plusYears(1)); 

Если вы хотите увидеть, является ли по-прежнему действует членство одного года, вы можете использовать

Period membershipLength = Period.ofYears(1); 
LocalDate membershipStart = ...; 
LocalDate membershipEnd = membershipStart.plus(membershipLength); 

LocalDate today = LocalDate.now(); 
boolean memberShipEnded = today.isAfter(membershipEnd); 
boolean membershipValid = !membershipEnded; 
+2

Поскольку один год может иметь переменную количество дней, это невозможно. Скажите, каков следующий расчет, на который вы будете использовать количество дней, и, может быть, мы сможем найти другой путь? –

+0

Нет следующего расчета. Думайте об этом как о членстве или подписке. Если вы начнете членство сегодня, которое длится год, в какой день членство закончится? (и я хотел использовать дату/время java8) – user2272115

+5

@ user2272115: Вам нужно указать год, который вас интересует, поскольку разные годы имеют разную длину. Итак, для «today», то есть 'Year.now(). Length()'. Если вам нужна дата окончания членства, то есть 'LocalDate.now(). PlusYears (1)'. –

9

Похоже, что вам не нужна длительность (= между двумя датами), но длина года определенной даты.

LocalDate dateLeap = LocalDate.of(2004, Month.MARCH, 1); 
System.out.println("leap year of " + dateLeap 
    + " has days: " + dateLeap.lengthOfYear()); 

високосный год 2004-03-01 имеет дней: 366

Java 8 Дата & время поражает полным.


Если вы имеете в виду, в 5 января 2004 года по 5 января 2005 = и 2 марта 2004 по 2RD марта 2005 = :

int lengthOfYear(LocalDate date) { 
    return date.getMonthValue() <= 2 
     ? date.lengthOfYear()    // Count Feb in this year 
     : date.plusYears(1).lengthOfYear(); // Count Feb in next year 
} 

Пояснение: в основном длина 365 Но если дата -> = март, то февраль в следующем году засчитывается, иначе в феврале этого года.

Учтите, что plusYears(1) не изменится ДЕНЬ или МЕСЯЦ.

Также не рассматриваются ни прыжки, ни час/минута 29 февраля.

+5

Также вы можете сделать 'Year.of (2004) .length()'. –

+0

@ ChristofferHammarström - самое простое решение, которое нужно иметь в виду. –

+0

Мне нужна продолжительность. Продолжительность между сегодняшним днем ​​и 1 годом с сегодняшнего дня, и я хочу, чтобы продолжительность в количестве дней. Есть несколько способов определить, какие годы имеют 366 дней. – user2272115

Смежные вопросы