Solved

Date time difference in months

Posted on 2006-10-24
5
224 Views
Last Modified: 2008-01-09
If i have two dates as Calendar instances:  2006-23-02 00:00:00 and 2002-12-09 00:00:00 then i need the number of months between the two dates. how can i do this?

Note: the dates never have times.

// currently this is what i have but it's not completely accurate because i assume that each month is 30 days
private int getNumMonths(Calendar mostrecent, Calendar old, boolean cleartime) {
        if(cleartime) {
            mostrecent.set(Calendar.MILLISECOND, 0);
            mostrecent.set(Calendar.SECOND, 0);
            mostrecent.set(Calendar.MINUTE, 0);
            mostrecent.set(Calendar.HOUR_OF_DAY, 0);

            old.set(Calendar.MILLISECOND, 0);
            old.set(Calendar.SECOND, 0);
            old.set(Calendar.MINUTE, 0);
            old.set(Calendar.HOUR_OF_DAY, 0);
        }
       
        // difference between the 2 dates in millis
        long difference = mostrecent.getTimeInMillis() - old.getTimeInMillis();

        // set the calendar object representing the difference
        Calendar diff = Calendar.getInstance();
        diff.setTimeInMillis(difference);

        long diffMonths = (difference/(24*60*60*1000))/30;
        return(StringTools.strToInt("" + diffMonths));
}
0
Comment
Question by:tbboyett
  • 2
  • 2
5 Comments
 
LVL 24

Expert Comment

by:sciuriware
ID: 17798439
>>>    long difference = mostrecent.getTimeInMillis() - old.getTimeInMillis();
That's already nearly the answer,

       return(difference/(24*60*60*1000*30);// returns a long, rounded down.
or:

       return(difference/(24.0*60*60*1000*30);// returns a double with a fraction.

Don't forget to type your method long or double.
;JOOP!
0
 
LVL 5

Author Comment

by:tbboyett
ID: 17798516
thanks for the response.

>> return(difference/(24*60*60*1000*30);
this returns a (negative) number that is way off from the number of months between the two dates
0
 
LVL 9

Assisted Solution

by:shinobun
shinobun earned 100 total points
ID: 17798922
Take the difference of (year * 12 + month).
0
 
LVL 24

Accepted Solution

by:
sciuriware earned 300 total points
ID: 17801208
Of course negative if you don't control the sequence of the dates.
Then use:

       return(Math.abs(difference/(24*60*60*1000*30));// returns a long, rounded down.
or:

       return(Math.abs(difference/(24.0*60*60*1000*30));// returns a double with a fraction.

;JOOP!
0
 
LVL 5

Author Comment

by:tbboyett
ID: 17803280
Thanks guys for your help, but i've found a solution that works for what i need.

here it is incase anyone needs it:

private int getNumMonthBetweenTwoDates(Calendar mostrecent, Calendar old, boolean cleartime) {    
        boolean done = false;
        int numMonths = 0;
       
        if(cleartime) {
            mostrecent.set(Calendar.MILLISECOND, 0);
            mostrecent.set(Calendar.SECOND, 0);
            mostrecent.set(Calendar.MINUTE, 0);
            mostrecent.set(Calendar.HOUR_OF_DAY, 0);

            old.set(Calendar.MILLISECOND, 0);
            old.set(Calendar.SECOND, 0);
            old.set(Calendar.MINUTE, 0);
            old.set(Calendar.HOUR_OF_DAY, 0);
        }
       
        while(!done) {
            mostrecent.add(Calendar.MONTH, -1);
            if((mostrecent.get(Calendar.MONTH) == old.get(Calendar.MONTH)) &&
               (mostrecent.get(Calendar.YEAR) == old.get(Calendar.YEAR))) {
               // found the old date month
               
               numMonths ++; // add an extra month to round up
               done = true;
            }
            numMonths ++;
        }
       
        return (numMonths);
}
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
Application launch issue with Apache Tomcat 5 23
Passing list of object to Oracle Database Procedure 3 60
Java Jpanels and Jframe 8 28
table example 4 23
An old method to applying the Singleton pattern in your Java code is to check if a static instance, defined in the same class that needs to be instantiated once and only once, is null and then create a new instance; otherwise, the pre-existing insta…
This was posted to the Netbeans forum a Feb, 2010 and I also sent it to Verisign. Who didn't help much in my struggles to get my application signed. ------------------------- Start The idea here is to target your cell phones with the correct…
Viewers will learn about the different types of variables in Java and how to declare them. Decide the type of variable desired: Put the keyword corresponding to the type of variable in front of the variable name: Use the equal sign to assign a v…
Viewers will learn about basic arrays, how to declare them, and how to use them. Introduction and definition: Declare an array and cover the syntax of declaring them: Initialize every index in the created array: Example/Features of a basic arr…

920 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

15 Experts available now in Live!

Get 1:1 Help Now