-2

Hi i am trying to calculate difference of two dates in days. The dates are 14 of this month and today. It should be 2. But o/p is 0 always. Code:

    long today = (new java.util.Date().getTime());
    long difference =(long) (today - 1394809789186.0);
    long daysdifference = difference/(24*3600*1000);
    System.out.println(daysdifference);

o/p: 0.

whats wrong?

Now i did another trick and it gives perfect answer dont know whats wrong with above code...

   SimpleDateFormat df = new SimpleDateFormat("dd.mm.yyyy"); 
    long firstdateseconds = df.parse("14.03.2014").getTime();
    long today = df.parse("16.03.2014").getTime();
    long difference = (today-firstdateseconds);
    long days = (long)(difference/(24*3600*1000));
    System.out.println(days);

o/p : 2 // now correct bingo!

Guys whats happening?

3 Answers3

0

I used the following simple code to accomplish what you want:

import java.util.Date;

public class datediff {
    public static void main(String[] args) {

        Date d1 = new Date();
        Date d2 = new Date(2014 - 1900, 2, 14);
        long d1_millis = d1.getTime();
        long d2_millis = d2.getTime();
        long diffMillis = d1_millis - d2_millis;
        long diffDays = diffMillis / (24 * 3600 * 1000);
        System.out.println("Difference in days: " + diffDays);

    }
}

OUTPUT:

Difference in days: 2


Also note that the magic number that you are using while calculating the difference is incorrect.

The actual value to subtract is : 1394735400000

That is the most dangerous disadvantage of using magic numbers.

Hope that clarifies things for you.

Crystal Meth
  • 589
  • 1
  • 4
  • 16
0

Perhaps a combined TimeZone and "Time (hours/minutes/seconds)" issue?

Case I

Different timezones and different day times:

 public static void main(final String[] args) {

    final Calendar march14 = Calendar.getInstance(TimeZone.getTimeZone("US/Hawaii"));
    march14.set(2014, Calendar.MARCH, 14, 23, 59, 0);

    final Calendar march16 = Calendar.getInstance(TimeZone.getTimeZone("Asia/Tokyo"));
    march16.set(2014, Calendar.MARCH, 16, 0, 0, 0);

    final long diffInMs = march16.getTimeInMillis() - march14.getTimeInMillis();
    System.out.println("diff = " + diffInMs / (24 * 3600 * 1000)+" day(s)");

}

This prints:

diff = 0 day(s)

Case II

However, adjusting the time zone:

public static void main(final String[] args) {

    final Calendar march14 = Calendar.getInstance(TimeZone.getTimeZone("US/Hawaii"));
    march14.set(2014, Calendar.MARCH, 14, 23, 59, 0);

    final Calendar march16 = Calendar.getInstance(TimeZone.getTimeZone("US/Hawaii")); // <- CHANGE!
    march16.set(2014, Calendar.MARCH, 16, 0, 0, 0);

    final long diffInMs = march16.getTimeInMillis() - march14.getTimeInMillis();
    System.out.println("diff = " + diffInMs / (24 * 3600 * 1000)+" day(s)");

}

This prints:

diff = 1 day(s)

Case III

And adjusting the time (hours/minutes/seconds):

public static void main(final String[] args) {

    final Calendar march14 = Calendar.getInstance(TimeZone.getTimeZone("US/Hawaii"));
    march14.set(2014, Calendar.MARCH, 14, 0, 0, 0);  // <- CHANGE!

    final Calendar march16 = Calendar.getInstance(TimeZone.getTimeZone("US/Hawaii"));
    march16.set(2014, Calendar.MARCH, 16, 0, 0, 0);

    final long diffInMs = march16.getTimeInMillis() - march14.getTimeInMillis();
    System.out.println("diff = " + diffInMs / (24 * 3600 * 1000)+" day(s)");

}

This prints:

diff = 2 day(s)

Conclusions

My two advices:

  • Don't use magic numbers, set all parts of your date/calendar objects that are relevant
  • Always set the TimeZone when working with date/time

Additional note to SimpleDateFormat

By the way: In SimpleDateFormat m is for minutes, M for month in year, see http://docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html. It was pure random that the result of your calculations was 2.

Peter Keller
  • 7,526
  • 2
  • 26
  • 29
-1

Use double you are crossing a truncation issue

venergiac
  • 7,469
  • 2
  • 48
  • 70