Difference between hh:mm a and HH:mm a

AlwaysALearner picture AlwaysALearner · Dec 23, 2015 · Viewed 33k times · Source

Here is my original code-

String dateString = "23 Dec 2015 1:4 PM";
Locale locale = new Locale("en_US");
SimpleDateFormat formatter = new SimpleDateFormat("dd MMM yyyy HH:mm a");
DateFormat df = new SimpleDateFormat("dd MMM yyyy HH:mm a", locale);
Date date = null;

try {
    date = formatter.parse(dateString);
} catch (ParseException e) {
    LOGGER.error(e);
}

String newDate = df.format(date);
System.out.println("oldDate = " + dateString);
System.out.println("newDate = " + newDate);

and here is my output-

oldDate = 23 Dec 2015 1:4 PM
newDate = 23 Dec 2015 01:04 AM

There is AM-PM difference between the oldDate and newDate. Now I changed the DateFormat code to-

SimpleDateFormat formatter = new SimpleDateFormat("dd MMM yyyy hh:mm a");
DateFormat df = new SimpleDateFormat("dd MMM yyyy hh:mm a", locale);

and I get the expected output, which is-

oldDate = 23 Dec 2015 1:4 PM
newDate = 23 Dec 2015 01:04 PM

I'm aware that HH signifies the 24 hour format and hh signifies the 12-hour format.

My question is

If I use HH:mm a instead of hh:mm a, shouldn't this be returning the time in 24-hour format?

(or)

If it defaults to 12-hour format, shouldn't it return respective AM/PM marker depending on the date input provided?

This is just for my understanding.

Answer

Mr.Arjun picture Mr.Arjun · Dec 23, 2015

Updated Answer

Here the problem is with Program flow

SimpleDateFormat formatter = new SimpleDateFormat("dd MMM yyyy HH:mm a");

this simple date formatter is used to format the date string the Date object is created, here is the important part of answer

As you are using HH instead of hh, the SimpleDateFormater considers that provided date string is in 24-Hour Format and simply ignores the AM/PM marker here.

The Date Object from constructed from this SimpleDateFormatter is passed to the

DateFormat df = new SimpleDateFormat("dd MMM yyyy HH:mm a", locale);

That's why it's printing

newDate = 23 Dec 2015 01:04 AM

if you change the line

SimpleDateFormat formatter = new SimpleDateFormat("dd MMM yyyy HH:mm a");

with

SimpleDateFormat formatter = new SimpleDateFormat("dd MMM yyyy hh:mm a");

Everything will go smooth as it should!

Note : when creating a locale you should pass the language code to the Locale() constructor. en-us not en_us.

IMP : Code is tested on Java 8 also. Java(TM) SE Runtime Environment (build 1.8.0_121-b13)