Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java calculate days in year, or between two dates

Tags:

Is there a method in any native Java class to calculate how many days were/will be in a specific year? As in, was it a Leap year (366 days) or a normal year (365 days)?

Or do I need to write it myself?

I'm calculating the number of days between two dates, for example, how many days left until my birthday. I want to take into account the February 29 of Leap year. I have it all done except that 29th.

like image 498
jurchiks Avatar asked Jan 24 '11 21:01

jurchiks


People also ask

How do I get the number of days between two dates in Java?

The Period class has a between() method - just as the previously discussed ChronoUnit . This method takes in two LocalDate objects, one representing the starting date, and the second being the end date. It returns a Period consisting of the number of years, months, and days between two dates.

How do I calculate the number of days between two dates in Java 8?

In Java 8, we can use ChronoUnit. DAYS. between(from, to) to calculate days between two dates.


2 Answers

Another way to do it is to ask the Calendar class for the actual maximum days in a given year:

Calendar cal = Calendar.getInstance(); cal.setTime(new Date());  int numOfDays = cal.getActualMaximum(Calendar.DAY_OF_YEAR); System.out.println(numOfDays); 

This will return 366 for a bisestile year, 365 for a normal one.

Note, I used getActualMaximum instead of getMaximum, which will always returns 366.

like image 185
Trasplazio Garzuglio Avatar answered Oct 06 '22 08:10

Trasplazio Garzuglio


tl;dr

Year.of( 2015 ).length() 

…and…

Year.isLeap( 2015 ) 

java.time.Year

In Java 8 and later we have the java.time package. (Tutorial)

length

The Year class represents a single year value. You can interrogate its length.

int daysInYear = Year.of( 2015 ).length(); 

isLeap

You can also ask if a year is a Leap year or not.

Boolean isLeapYear = Year.isLeap( 2015 ); 

As an example, get the number of days in year using Java’s ternary operator, such as:

minVal = (a < b) ? a : b;

In our case, we want number of days of year. That is 365 for non-Leap years, and 366 for Leap year.

int daysInYear = ( Year.isLeap( 2015 ) ) ? 366 : 365 ; 

Day-of-year

You can get the day-of-year number of a date. That number runs from 1 to 365, or 366 in a leap year.

int dayOfYear = LocalDate.now( ZoneId.of( "America/Montreal" ).getDayOfYear() ; 

Going the other direction, get a date for a day-of-year.

Year.now( ZoneId.of( "America/Montreal" ) ).atDay( 159 ) ; 

You could determine elapsed days by comparing these day-of-year numbers when dealing with a single year. But there is an easier way; read on.

Elapsed days

Use the ChronoUnit enum to calculate elapsed days.

LocalDate start = LocalDate.of( 2017 , 2 , 23 ) ; LocalDate stop = LocalDate.of( 2017 , 3 , 11 ) ; int daysBetween = ChronoUnit.DAYS.between( start , stop ); 

Automatically handles Leap Year.


About java.time

The java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date, Calendar, & SimpleDateFormat.

The Joda-Time project, now in maintenance mode, advises migration to the java.time classes.

To learn more, see the Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310.

Where to obtain the java.time classes?

  • Java SE 8, Java SE 9, and later
  • Built-in.
  • Part of the standard Java API with a bundled implementation.
  • Java 9 adds some minor features and fixes.
  • Java SE 6 and Java SE 7
  • Much of the java.time functionality is back-ported to Java 6 & 7 in ThreeTen-Backport.
  • Android
  • The ThreeTenABP project adapts ThreeTen-Backport (mentioned above) for Android specifically.
  • See How to use ThreeTenABP….

The ThreeTen-Extra project extends java.time with additional classes. This project is a proving ground for possible future additions to java.time. You may find some useful classes here such as Interval, YearWeek, YearQuarter, and more.

like image 29
Basil Bourque Avatar answered Oct 06 '22 07:10

Basil Bourque