DEV Community

HousniAbdellatife
HousniAbdellatife

Posted on

2 3

Introduction to JAVA8 Date/Time API

Java 8 was released in March 2014 and brought a lot of language improvements. One of those is new Date and Time API for Java, also known as JSR-310. It represents a very rich API for working with dates and time.

Issues with java.util.Date and java.util.Calendar:

  • A Date instance represents an instant in time, not a date.
  • It rates years as two digits since 1900.
  • Months are zero indexed (0 – January, 11 – December).
  • All classes in this old API are mutable, and not thread safe.

New Java8 Date/Time API:

  • Thread Safety: the new Date and Time APIs introduced in Java 8 are immutable and thread safe,
  • Domain-driven design: The new API models its domain very precisely with classes that represent different use cases for Date and Time closely
  • ZonedDate and Time: handling of timezone can be done with Local and ZonedDate/Time APIs.

java.time.LocalDate :

we can create LocalDate objects using one of the following its static methods:

 LocalDate nowDate = LocalDate.now(); //Obtains the current date from the system clock in the default time-zone.       
 LocalDate date  = LocalDate.of(int year, int month, int day); //January is equivalent to 1 

we can also create LocalDate from a String:

 LocalDate date = LocalDate.parse("2012-01-26"); // default format is yyyy-MM-dd

the most common useful methods :

 LocalDate date  = LocalDate.of(2020, 01, 01);

 date.plusDays(2);
 date.plusMonths(3L);
 date.plusWeeks(1);
 date.plusYears(12);

 date.minusDays(2L);
 date.minusMonths(3);
 date.minusWeeks(1L);
 date.minusYears(12);

 date.isLeapYear();
 date.isBefore(LocalDate.now());
 date.isAfter(LocalDate.now());

 date.getDayOfMonth(); // day of month is 1-index
 date.getDayOfWeek();  // returns DayOfWeek enum
 date.getDayOfYear();  // day of year is 1-index

java.time.LocalTime :

  • LocalTime is an immutable date-time object that represents a time.
  • This class is immutable and thread-safe.
  • time without a time-zone.
  • it follows ISO-8601 calendar system

we can create LocalTime objects using one of the following its static methods:

 LocalTime.now();
 LocalTime.of(int hour, int minute);
 LocalTime.of(int hour, int minute, int second);
 LocalTime.of(int hour, int minute, int second, int nanoOfSecond);
 LocalTime.parse("12:05:12:001");

the most common useful methods :

 LocalTime time = LocalTime.now();

 time.getMinute(); 
 time.getHour();  
 time.getSecond();
 time.getNano();

 time.isAfter(LocalTime.now());
 time.isBefore(LocalTime.now());

 time.minusHours(2L); 
 time.minusMinutes(1L);
 time.minusSeconds(10);
 time.minusNanos(23);

 time.plusHours(2L);
 time.plusMinutes(1L);
 time.plusSeconds(10);
 time.plusNanos(23);

java.time.LocalDateTime :

  • represents a combinaison of date and time.
  • immutable object and thread safe.
  • It follow ISO-8601.

we can create LocalTime objects using one of the following its static methods:

  LocalDateTime dateTime = LocalDateTime.now();
  LocalDateTime.of(int year, int month, int dayOfMonth, int hour, int minute);
  LocalDateTime.of(int year, int month, int dayOfMonth, int hour, int minute, int second);
  LocalDateTime.of(int year, int month, int dayOfMonth, int hour, int minute, int second, int nanoOfSecond) ;
  LocalDateTime.of(LocalDate date, LocalTime time); 

Method chaining :
chaining method is an very useful technic that used with immutable objects to write clear and clean code and more concise, and avoid multi statements code.

int dayOfYear = LocalDate.of(2,2, 2022)
                .minusDays(2)
                .plusWeeks(4)
                .minusMonths(4)
                .getDayOfYear();

java.time.Period :

A date-based amount of time in the ISO-8601 calendar system, such as '2 years, 3 months and 4 days'.

The total period of time is represented by all three units together: months, days, and years.

The Date can be manipulated using Period as shown in the following code snippet:

  LocalDate  initialDate = LocalDate.parse("2020-02-25");
  LocalDate endDate = initialDate.plus(Period.ofDays(4));
  Period difference = Period.between(initialDate, endDate);

if we are going to use the same multiple times, we can create an object Period and reused:

  // Period of 5 years, 4 months, and 2 days
   Period period = Period.of(5, 4 , 2);

java.util.Duration :
Similar to Period, the Duration class is use to deal with Time.
A time-based amount of time, such as '34.5 seconds'.

in this example we create an LocalTime object 4:5:45am and add 30 seconds to it.

  LocalTime initialTime = LocalTime.of(4, 5, 45);
  LocalTime endTime = initialTime.plus(Duration.ofSeconds(43));

The Duration between two instants can be obtained as a Duration:

   Duration difference = Duration.between(initialTime, endTime);
   long seconds = difference.getSeconds();

java.time.Instant:
the class stores a long representing epoch-seconds and an int representing nanosecond-of-second, which will always be between 0 and 999,999,999.

The instant is defined as an offset since the origin (called an epoch). The origin is Jan. 1st 1970 - 00:00 - Greenwhich mean time (GMT).

Instant instant = Instant;
System.out.println(instant);

we can create an LocalDateTime from an instant as following, but we need a timeZone also:

Instant instant = Instant.now();
LocalDateTime.ofInstant(instant, ZoneId.systemDefault());

From java.util.Date to a LocalDateTime:
Java8 added the method toInstant() to Date object which help us to convert a Date or Calendar to the new java date/time api, let's see how:

Date date = new Date();
LocalDateTime localDateTime = LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());       
LocalDate localDate = localDateTime.toLocalDate();
LocalTime localTime = localDateTime.toLocalTime();

Date and Time Formatting :
Java 8 provides APIs for the easy formatting of Date and Time.

the code below shows default date format:

LocalDateTime localDateTime = LocalDateTime.of(2019, 06, 19, 12, 05, 23);
System.out.println(localDateTime);

its output is:

2019-06-19T12:05:23

also we can use predefined ISO format:

LocalDateTime localDateTime = LocalDateTime.of(2019, 06, 19, 12, 05, 23);
String  localDateTimeString = localDateTime.format(DateTimeFormatter.ISO_DATE);
System.out.println(localDateTimeString);

the output is :

2019-06-19

we can create our format as following :

LocalDateTime localDateTime = LocalDateTime.of(2019, 06, 19, 12, 05, 23);   
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("dd/yyyy/MM");
String  localDateTimeString = localDateTime.format(dateTimeFormatter);
System.out.println(localDateTimeString);

output is :

19/2019/06

Heroku

Simplify your DevOps and maximize your time.

Since 2007, Heroku has been the go-to platform for developers as it monitors uptime, performance, and infrastructure concerns, allowing you to focus on writing code.

Learn More

Top comments (0)

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay