Getting Current Date Time in Java

Getting Current Date Time in Java

0 Comments

As a Java programmer, you will often need to work with date and time. In this post, we will learn how to get the current time of the day in Java applications. In Java, there are several ways for this and the primary classes that programmers typically use are the Date and Calendar classes. You can use both the classes to calculate the current time of the day and then use the SimpleDateFormat class to format the time according to your requirements.

Using the Date and Calendar Classes

To calculate the current time you create a Date object, specify a format to present the current time of the day, and finally, use the SimpleDateFormat class to format the time as you specified.

Here is the code.

. . .
public static void getCurrentTimeUsingDate() {
    Date date = new Date();
    String strDateFormat = "hh:mm:ss a";
    DateFormat dateFormat = new SimpleDateFormat(strDateFormat);
    String formattedDate= dateFormat.format(date);
    System.out.println("Current time of the day using Date - 12 hour format: " + formattedDate);
}
. . . .

In the code above, we created a Date object and specified the format for the time. In the format string, the lower case hh represents a 12-hour format while mm and ss represents minutes in hour and seconds in minutes respectively. Also, a in the format string is the am/pm marker. We then created a SimpleDateFormat object initialized with the format string and called the format() method on it passing the Date object. The format() method returns the current time in the format we specified.

Using the Calendar class is equally simple. Here is the code.

. . .
public static void getCurrentTimeUsingCalendar() {
    Calendar cal = Calendar.getInstance();
    Date date=cal.getTime();
    DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
    String formattedDate=dateFormat.format(date);
    System.out.println("Current time of the day using Calendar - 24 hour format: "+ formattedDate);
}
. . .

In the code above, we called the getInstance() factory method of the Calendar class to obtain a Calendar object and then called the getTime() method on it. This method returns a Date object. The remaining code is the same as I explained in the preceding Date example. The only difference you should observe is the format string. Here we specified hour as HH (Upper case) which will give us the time in 24-hour format.

Here is the complete code.

CurrentTimeDateCalendar

package guru.springframework.blog.currenttime;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class CurrentTimeDateCalendar {
    public static void getCurrentTimeUsingDate() {
        Date date = new Date();
        String strDateFormat = "hh:mm:ss a";
        DateFormat dateFormat = new SimpleDateFormat(strDateFormat);
        String formattedDate= dateFormat.format(date);
        System.out.println("Current time of the day using Date - 12 hour format: " + formattedDate);
    }
    public static void getCurrentTimeUsingCalendar() {
        Calendar cal = Calendar.getInstance();
        Date date=cal.getTime();
        DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
        String formattedDate=dateFormat.format(date);
        System.out.println("Current time of the day using Calendar - 24 hour format: "+ formattedDate);
    }
}

 

We will next write a test class.

CurrentTimeDateCalendarTest

package guru.springframework.blog.currenttime;

import org.junit.Test;

import static org.junit.Assert.*;


public class CurrentTimeDateCalendarTest {

    @Test
    public void testGetCurrentTimeUsingDate() throws Exception {
        CurrentTimeDateCalendar.getCurrentTimeUsingDate();

    }

    @Test
    public void testGetCurrentTimeUsingCalendar() throws Exception {
        CurrentTimeDateCalendar.getCurrentTimeUsingCalendar();
    }
}

 

The output is this.

 -------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running guru.springframework.blog.currenttime.CurrentTimeDateCalendarTest
Current time of the day using Date - 12 hour format: 11:13:01 PM
Current time of the day using Calendar - 24 hour format: 23:13:01
Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec - in guru.springframework.blog.currenttime.CurrentTimeDateCalendarTest

By now, you might be thinking that calculating current time in Java can never be easier. But the Date and Calendar classes have some inherent disadvantages. When you start developing enterprise applications, the disadvantages become more obvious. Primarily, both the classes are not thread-safe, which might lead to concurrency issues. Also, both the classes have the limitation of calculating time to milliseconds only. In mission-critical enterprise applications, it is often required to represent time to nanosecond precision.
In addition, even though the Date class is not itself deprecated, due to poor API design most of its constructors and methods are now deprecated. Because of such issues, enterprise application developers turned toward third-party specialized date and time APIs, particularly Joda-Time.

Using java.time

The Java specification team of Oracle realized the limitations of the in-built date and time handling API and to provide a more efficient API introduced the java.time package in the new Java SE 8. This project is developed jointly by Oracle and Stephen Colebourne, the author of Joda-Time. The new java.time API “is inspired by Joda-Time“.

Calculating Time of the Default Time Zone

The java.time package have several classes to work with date and time. Let’s start with some code to calculate the current time of the default time zone.

. . .
public static void getCurrentTime(){
     System.out.println("-----Current time of your time zone-----");
     LocalTime time = LocalTime.now();
     System.out.println("Current time of the day: " + time);
 }
. . .

As you can observe, the code is pretty straight forward. We called the now() method of LocalTime that returns a LocalTime object. This is an immutable object that represent a time without a date and a time-zone in the ISO-8601 calendar system.

The output of the code is.

 -----Current time of your time zone-----
Current time of the day: 23:13:01.762

In the output above, observe that the time is represented to nanosecond precision.

Calculating Time of a Different Time Zone

The java.time package provides classes that you can use to get the current time of a different time zone. As an example, if you are located in your default time zone and you want the current time of the day of a different time zone, say America/Los_Angeles, you can use the following classes:

  • ZoneId: Represents a particular time zone.
  • DateTimeFormatter: Similar to the SimpleDateFormat class we discussed earlier, this class is a formatter for parsing and printing date-time objects.

The code to calculate the current time of a different time zone is this.

. . .
public static void getCurrentTimeWithTimeZone(){
    System.out.println("-----Current time of a different time zone using LocalTime-----");
    ZoneId zoneId = ZoneId.of("America/Los_Angeles");
    LocalTime localTime=LocalTime.now(zoneId);
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss");
    String formattedTime=localTime.format(formatter);
    System.out.println("Current time of the day in Los Angeles: " + formattedTime);

}
. . .. .

In Line 4 – Line 5, we created a ZoneId object to represent the America/Los_Angeles time zone and then obtained the current time of the time zone by calling the now() method passing the ZoneId. The LocalTime object that the now() method returns holds the current time of the day of America/Los_Angeles. From Line 6 – Line 8, we formatted the time into 24 hour format using DateTimeFormatter and printed out the formatted time.

The output of the code is.

 -----Current time of a different time zone using LocalTime-----
Current time of the day in Los Angeles: 16:29:23

Calculating Time of a Different Time Offset

Time offset is the amount of time in hours and minutes added to or subtracted from Coordinated Universal Time (UTC). The java.time package provides the ZoneOffset class to calculate the current time of the day of a different time offset.

The code to use the ZoneOffset class is this.

. . .
public static void getCurrentTimeWithOffset(){
    System.out.println("-----Current time of different offset-----");
    ZoneOffset zoneOffset = ZoneOffset.of("-08:00");
    ZoneId zoneId=ZoneId.ofOffset("UTC", zoneOffset);
    LocalTime offsetTime = LocalTime.now(zoneId);
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("hh:mm a");
    String formattedTime=offsetTime.format(formatter);
    System.out.println("Current time of the day with offset -08:00: " + formattedTime);

}
. . .

In the code above, we created a ZoneOffset object in Line 4 to represent the -8:00 time offset. In Line 5 we created a ZoneId object initialized with the ZoneOffset object. The remaining code from Line 6 to Line 9 uses a LocalTime object initialized with the ZoneId and a DateTimeFormatter object to format the time in the 12 – hour format with the am/pm marker

The output of the preceding code is.

 -----Current time of different offset-----
Current time of the day with offset -08:00: 03:29 PM

The complete code of the snippets we discussed is this.

package guru.springframework.blog.currenttime;

import java.time.*;
import java.time.format.DateTimeFormatter;
public class CurrentTimeJava8 {
   public static void getCurrentTime(){
        System.out.println("-----Current time of your time zone-----");
        LocalTime time = LocalTime.now();
        System.out.println("Current time of the day: " + time);
    }
    public static void getCurrentTimeWithTimeZone(){
        System.out.println("-----Current time of a different time zone using LocalTime-----");
        ZoneId zoneId = ZoneId.of("America/Los_Angeles");
        LocalTime localTime=LocalTime.now(zoneId);
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss");
        String formattedTime=localTime.format(formatter);
        System.out.println("Current time of the day in Los Angeles: " + formattedTime);

    }
    public static void getCurrentTimeWithOffset(){
        System.out.println("-----Current time of different offset-----");
        ZoneOffset zoneOffset = ZoneOffset.of("-08:00");
        ZoneId zoneId=ZoneId.ofOffset("UTC", zoneOffset);
        LocalTime offsetTime = LocalTime.now(zoneId);
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("hh:mm a");
        String formattedTime=offsetTime.format(formatter);
        System.out.println("Current time of the day with offset -08:00: " + formattedTime);

    }
}

 

Let’s write a test class to see the code in action.

package guru.springframework.blog.currenttime;

import org.junit.Test;

import static org.junit.Assert.*;

public class CurrentTimeJava8Test {
    @Test
    public void testGetCurrentTime() throws Exception {
        CurrentTimeJava8.getCurrentTime();
    }
    @Test
    public void testGetCurrentTimeWithTimeZone() throws Exception {
        CurrentTimeJava8.getCurrentTimeWithTimeZone();
         }
    @Test
    public void testGetCurrentTimeWithOffset() throws Exception {
        CurrentTimeJava8.getCurrentTimeWithOffset();
    }
}

 

The output I got on running the test using Maven is shown below, which obviously will differ based on your current time and time zone.

 -------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running guru.springframework.blog.currenttime.CurrentTimeJava8Test
-----Current time of your time zone-----
Current time of the day: 06:59:52.803
-----Current time of a different time zone using LocalTime-----
Current time of the day in Los Angeles: 18:29:52
-----Current time of different offset-----
Current time of the day with offset -08:00: 05:29 PM
Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 4.337 sec - in guru.springframework.blog.currenttime.CurrentTimeJava8Test

Summary

In terms of working with time in Java, this post has only scratched the surface. The java.time package has an extensive set of classes that simplifies working with date and time. However, you will also encounter the Date and Calendar classes and the Joda-Time API when you work on legacy applications. But, with the powerful features built in java.time, you can easily convert your legacy date and time calculation code to java.time. Go ahead and explore the java.time API, which is very well documented and easy to use.

Keep in mind when you’re using the local time options, Java is going through the JVM to talk to whatever machine it is running on. This is how Java is determines the time and the locale of time operations. Thus, your code can produce different results when running on different machines. As a word of caution, when you’re working on small applications, often you won’t need to worry about time timezone. But in larger applications, you will. You will need to make your code aware of the timezone. Many developers overlook the timezone component, then run into problems later as their application grows.

 

About jt

    You May Also Like

    Leave a Reply

    Your email address will not be published. Required fields are marked *

    This site uses Akismet to reduce spam. Learn how your comment data is processed.