How to calculate the number of days in a period?

JavaJava 8

Java Problem Overview


For the following Period calculation:

Period.between(LocalDate.of(2015, 8, 1), LocalDate.of(2015, 9, 2))

the result is:

P1M1D

This is equivalent to 31 days + 1 day = 32 days.

For this Period:

Period.between(LocalDate.of(2015, 8, 1), LocalDate.of(2015, 10, 2))

the result is:

P2M1D

This is equivalent to: 31 days (in August) + 30 days (in September) + 1 (in October) = 62 days

Is there a method in the java.time package which will give the number of days in a Period? I can't find one. Not sure if I have overlooked anything or if it is just plain not there.

Java Solutions


Solution 1 - Java

From the documentation:

> To define an amount of time with date-based values (years, months, > days), use the Period class. The Period class provides various get > methods, such as getMonths, getDays, and getYears.To present the amount >of time measured in a single unit of time, such as days, you can use the > ChronoUnit.between method. > > LocalDate today = LocalDate.now(); > LocalDate birthday = LocalDate.of(1960, Month.JANUARY, 1); >
> Period p = Period.between(birthday, today); > long p2 = ChronoUnit.DAYS.between(birthday, today); > System.out.println("You are " + p.getYears() + " years, " + p.getMonths() + > " months, and " + p.getDays() + > " days old. (" + p2 + " days total)"); > > The code produces output similar to the following: > > You are 53 years, 4 months, and 29 days old. (19508 days total)

Solution 2 - Java

There is no way to do what you ask. The reason is that it is not possible from a Period to deduce the actual number of calendar days in the period. A Period is not tied to specific dates, once constructed in the way you show, it loses track of the actual calendar dates.

For example your first period represents a period of 1 month and 1 day. But the period does not care which month. It is simply a concept of "a month and a day".

If you need the number of days between two dates you should use ChronoUnit.DAYS.between as Saket Mittal writes.

Solution 3 - Java

There's a specific object depending at the amount of time you'd like to deal with. This page here is very useful explaining which is best for your scenario.

> The ChronoUnit.between method is useful when you want to measure an amount of time in a single unit of time only, such as days or seconds

LocalDate localDateStartDate = LocalDate.of(2016, 06, 10);
LocalDate localDateEndDate = LocalDate.of(2016,06,23);
long days = ChronoUnit.DAYS.between(localDateStartDate, localDateEndDate);

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionM.K.View Question on Stackoverflow
Solution 1 - JavaSaket MittalView Answer on Stackoverflow
Solution 2 - JavaK ErlandssonView Answer on Stackoverflow
Solution 3 - JavaUalter Jr.View Answer on Stackoverflow