7

I want to calculate the difference between two date/time in java using Date and Calendar classes. The format that I have is "2012-01-24 12:30:00 PM".

I have implemented my own method and also google it to work with others, but haven't getting the right hint to handle AM and PM values.

The date/time difference got troubled whenever the time have 12(AM/PM) in it. For example if I have date/time "2012-01-24 12:30:00 PM" and "2012-01-24 02:30:00 PM" it shows the difference is 10 hours.

Considering the code on this link how can it be modified to handle AM and PM.

To convert String date into Date I use following code:

    String sessionTimeStart = "2012-01-24 12:30:00 PM";
    String sessionTimerEndOrCurrent = "2012-01-24 02:30:00 PM";
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss a"); 

    Date d1 = null;
    Date d0 = null; 
    try {
        d1 = format.parse(sessionTimeStart);
        d0 = format.parse(sessionTimerEndOrCurrent);
    } catch (ParseException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
rizzz86
  • 3,862
  • 8
  • 35
  • 52
  • How do you convert the string to a `Date` object? And how do you calculate the difference? If you use the code you linked, how do you call it? – Thomas Jan 25 '12 at 10:15

6 Answers6

8

The problem is your date format: instead of yyyy-MM-dd HH:mm:ss a use yyyy-MM-dd hh:mm:ss a.

HH will be the hour in day (0-23) whereas hh will be the hour in AM/PM (1-12). Thus with your date format 02:30:00 will be parsed as just that instead of being converted to the PM version (which in hour of day would be 14:30:00).

Thomas
  • 87,414
  • 12
  • 119
  • 157
5

The reason why it shows 10 hours as the difference is that you've got an error in the pattern when parsing the input.

Here's an example using SimpleDateFormat:

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss a");

Date date1 = df.parse("2012-01-24 12:30:00 PM");
Date date2 = df.parse("2012-01-24 02:30:00 PM");

long differenceInHours = Math.abs(date1.getTime() - date2.getTime()) / 1000 / 60 / 60);

Will return 10.

When we just slightly change the date format pattern, using hh for hour in am/pm (1-12) instead of HH for hour in day (0-23):

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss a");

It returns (the expected) 2.

See the documentation for SimpleDateFormat to get your patterns right.

hleinone
  • 4,470
  • 4
  • 35
  • 49
4

So, you have these dates as strings? Parse them with a SimpleDateFormat with the appropriate format string, and compute the difference in hours:

DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss a");

Date d1 = df.parse("2012-01-24 12:30:00 PM");
Date d2 = df.parse("2012-01-24 02:30:00 PM");

int hoursDifference = (int)((d2.getTime() - d1.getTime()) / 3600000L);
System.out.println("Difference in hours: " + hoursDifference);

Your error is that you are using HH (24-hour hours) instead of hh (12-hour hours) in your format string.

Jesper
  • 202,709
  • 46
  • 318
  • 350
  • Thanks @Jesper , I will try your solution as well. But the HH and hh seems to be the case that i am missing here – rizzz86 Jan 25 '12 at 10:44
2

Don't build it yourself, use an established library. Jodatime is used widely.

Hauke Ingmar Schmidt
  • 11,559
  • 1
  • 42
  • 50
1

onsider using Apache Commons DateUtils DurationFormatUtils formatPeriod method will do the magic.

Good luck!

EDIT Assuming that you have Date a and Date b initialized at this point,

String format="HH:mm:ss.SSS";   // whatever you wish
boolean padWithZeros=true; // whatever you wish
TimeZone timezone=null; // whatever you wish
long timeA = a.getTime();
long timeB = b.getTime();

String period = DurationFormatUtils.formatPeriod(timeB, timeA, format, padWithZeros, timezone);
aviad
  • 8,229
  • 9
  • 50
  • 98
-1

Calendar has a methode add() that can be used for substracting too. Take a look at it. You should be using Calendar instead of Date anyway because most of the Date operations are deprecated.

André Stannek
  • 7,773
  • 31
  • 52