tags:

views:

89

answers:

3

My heart is bleeding internally after having to go so deep to subtract two dates to calculate the span in number of days:

    GregorianCalendar c1 = new GregorianCalendar();
    GregorianCalendar c2 = new GregorianCalendar();
    c1.set(2000, 1, 1);
    c2.set(2010,1, 1);
    long span = c2.getTimeInMillis() - c1.getTimeInMillis();
    GregorianCalendar c3 = new GregorianCalendar();
    c3.setTimeInMillis(span);
    long numberOfMSInADay = 1000*60*60*24;
    System.out.println(c3.getTimeInMillis() / numberOfMSInADay); //3653

where it's only 2 lines of code in .NET, or any modern language you name.

Is this atrocious of java? Or is there a hidden method I should know?

Instead of using GregorianCalendar, is it okay to use Date class in util? If so, should I watch out for subtle things like the year 1970?

Thanks

+6  A: 

It's indeed one of the biggest epic failures in the standard Java API. Have a bit of patience, then you'll get your solution in flavor of the new Date and Time API specified by JSR 310 which is (most likely) going to be included in the upcoming Java 7.

Until then, you can get away with JodaTime.

DateTime dt1 = new DateTime(2000, 1, 1, 0, 0, 0, 0);
DateTime dt2 = new DateTime(2010, 1, 1, 0, 0, 0, 0);
int days = Days.daysBetween(dt1, dt2).getDays();

Its creator, Stephen Colebourne, is by the way the guy behind JSR 310, so it'll look much similar.

See also:

BalusC
I have a small project and need it in only a few places. Coming anew from .NET, I am just a bit infuriated and frustrated at java. Thanks for the confirmation, though.
Haoest
You could also create an utility method and hide it far away in the depths of your code so that you won't be directly bothered by the ugly Calendar API ;)
BalusC
+1  A: 

If you deal with dates it is a good idea to look at the joda time library for a more sane Date manipulation model.

http://joda-time.sourceforge.net/

Peter Tillemans
A: 

Well you can remove the third calendar instance.

GregorianCalendar c1 = new GregorianCalendar();
GregorianCalendar c2 = new GregorianCalendar();
c1.set(2000, 1, 1);
c2.set(2010,1, 1);
c2.add(GregorianCalendar.MILLISECOND, -1 * c1.getTimeInMillis());
Strom
I don't think GregorianCalendar is immutable, so if I should use c2 later again, I sort of like to have it the value as it was defined initially.
Haoest