Java 9 – Find difference between two ZonedDateTime instances upto nanosecond precision ?

In this article, we will learn how to find difference between two ZonedDateTime instances up-to Nanosecond precision using newly introduced methods in Java 1.9 version

Find difference between two ZonedDateTime instances up-to Nano precision :

  • To find difference between two ZonedDateTime instances, first we need to segregate Date & Time parts as there is no way to find difference between them directly
  • To segregate Date and Time parts separately, we can use toLocalDate() and toLocalTime() methods of ZonedDateTime
    • toLocalDate() – gets the LocalDate part of invoking ZonedDateTime
    • toLocalTime() – gets the LocalTime part of invoking ZonedDateTime
  • Use Period.between() method to find difference between 2 LocalDate instances
    • Period.between() method accepts 2 input-arguments and returns difference of two LocalDate,
      1. Pass organization joining date as 1st argument
      2. Pass organization relieving date as 2nd argument
    • Period class has many useful method like,
      1. getYears() – returns numbers of years between 2 LocalDate instances
      2. getMonths() – returns numbers of months between 2 LocalDate instances
      3. getDays() – returns numbers of days between 2 LocalDate instances
  • Similarly, use Duration.between() method to find difference between 2 LocalTime instances
    • Duration.between() method accepts 2 input-arguments and returns difference of two LocalTime,
      1. Pass office start time as 1st argument
      2. Pass office end time as 2nd argument
    • Duration class has many useful methods like,
      1. toHoursPart​() – Extracts the number of hours part in the duration
      2. toMinutesPart​() – Extracts the number of minutes part in the duration
      3. toSecondsPart​() – Extracts the number of seconds part in the duration
      4. toMillisPart​() – Extracts the number of milliseconds part of the duration
      5. toNanosPart​() – get the nanoseconds part within seconds of the duration
  • Finally print Time Period/Duration spent in an organization to the console

FindDifferenceOfTwoZonedDateTime.java

package in.bench.resources.java9.conversion;

import java.time.Duration;
import java.time.Period;
import java.time.ZoneId;
import java.time.ZonedDateTime;

public class FindDifferenceOfTwoZonedDateTime {

	public static void main(String[] args) {

		// get default system zone
		ZoneId zoneIdAsia = ZoneId.systemDefault();
		System.out.println("Default system zone is :- \n" + zoneIdAsia);


		// 1. organization joining date
		ZonedDateTime joiningDateTime = ZonedDateTime
				.of(2017, 3, 6, 10, 32, 56, 123456789, zoneIdAsia);
		System.out.println("\nOrganization Joining Date/time is :- \n" + joiningDateTime);


		// 2. organization relieving date
		ZoneId zoneIdEurope = ZoneId.of("Europe/Paris");
		ZonedDateTime relievingDateTime = ZonedDateTime
				.of(2019, 6, 28, 20, 31, 43, 987654321, zoneIdEurope);
		System.out.println("\nOrganization Relieving Date/time is :- \n" + relievingDateTime);


		// 3. difference between 2 LocalDate - Days spent in a organization
		Period period = Period.between(
				joiningDateTime.toLocalDate(), 
				relievingDateTime.toLocalDate()
				);
		System.out.println("\nPeriod between 2 LocalDate is :- \n" + period);


		// 3.1 get difference of years/months/days
		int years = period.getYears();
		int months = period.getMonths();
		int days = period.getDays();


		// 4. difference between 2 LocalTime - Time duration spent in Office
		Duration duration = Duration.between(
				joiningDateTime.toLocalTime(), 
				relievingDateTime.toLocalTime()
				);
		System.out.println("\nTime Duration between 2 LocalTime is :- \n" + duration);


		// 4.1 get difference in hours/minutes/seconds/millis/nanos
		int hours = duration.toHoursPart();
		int minutes = duration.toMinutesPart();
		long seconds = duration.toSecondsPart();
		int millis = duration.toMillisPart();
		int nanos = duration.toNanosPart();


		// 5. print to console
		System.out.print("\nPeriod & Time Duration spent in an Organization is :- \n"
				+ years + " Years " 
				+ months + " Months " 
				+ days + " Days "
				+ hours + " Hours " 
				+ minutes + " Minutes "
				+ seconds + " Seconds "
				+ millis + " Millisecond "
				+ nanos + " Nanosecond");
	}
}

Output:

Default system zone is :- 
Asia/Calcutta

Organization Joining Date/time is :- 
2017-03-06T10:32:56.123456789+05:30[Asia/Calcutta]

Organization Relieving Date/time is :- 
2019-06-28T20:31:43.987654321+02:00[Europe/Paris]

Period between 2 LocalDate is :- 
P2Y3M22D

Time Duration between 2 LocalTime is :- 
PT9H58M47.864197532S

Period & Time Duration spent in an Organization is :- 
2 Years 3 Months 22 Days 9 Hours 58 Minutes 47 Seconds 864 Millisecond 864197532 Nanosecond

Related Articles:

References:

Happy Coding !!
Happy Learning !!

Java 8 – How to get instantaneous moment at UTC/GMT using Instant ?
Java 9 – Find difference between two LocalDateTime instances upto nanosecond precision ?