Go Premium for a chance to win a PS4. Enter to Win

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 301
  • Last Modified:

Difference between 2 dates in Months rounded up to the nearest whole month

Hey,

Anyone know how to get the difference between 2 dates in months rounded to the nearest whole month AND also include the fact that the start date will be set to midnight but the end date will be set to 11:59:59pm AND this should be counted as 1 day?

Thanks

Peter
0
peterwnorman
Asked:
peterwnorman
  • 10
  • 9
  • 3
1 Solution
 
TimYatesCommented:
                       Calendar old = Calendar.getInstance();
                  old.setTime( date1 );

                  // set the calendar object representing the current date //
                  Calendar now = Calendar.getInstance();
                  now.setTime( date2 );

                  // get the difference between the 2 dates in milliseconds //
                  long difference = now.getTimeInMillis() - old.getTimeInMillis();

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

                  // print the difference //
                  System.out.println(diff.get(Calendar.MONTH) + " months" ) ;
0
 
zzynxSoftware engineerCommented:
So you mean given date1 and date2, get the difference expressed in number of months.
+ date1 has always 00:00:00 as time and date2 always has 23:59:59 as time.
Right?
0
 
TimYatesCommented:
My comment assumes you have date1 and date2 which are both java.util.Date objects :-)
0
Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
zzynxSoftware engineerCommented:
Hi Tim, quite close.
But does that "round to the nearest month"?
I don't think so.
0
 
peterwnormanAuthor Commented:
zznyx,

stated far more succinctly.

TimYates,

would your code handle month with 31 days in the way it would handle february (i.e. 1st feb to 2nd of Mar = 2 months; 1st of Mar to 31st of Mar = 1month)
0
 
TimYatesCommented:
How can you round to the nearest month?

How many days is 0.5 months?  Surely it depends on the number of days in a month?

And the question says:

> rounded to the nearest whole month

Which I took to mean "round down" ;-)
0
 
peterwnormanAuthor Commented:
Sorry Tim,

Meant to say part months are counted as whole months.
0
 
TimYatesCommented:
Hmmm...actually...that code needs a bit of thought ;-)

it will give you a difference, but it will be a bit odd...  How many days are you taking as a month?  4 weeks, 31, 28, what?
0
 
zzynxSoftware engineerCommented:
So you want

date1=x-may-2004 00:00:00
date2=y-jun-2004 23:59:00

to return 1 if y <= x
and to return 2 if y > x

Right?
0
 
zzynxSoftware engineerCommented:
Can't it be done like this:

1) int result = 0;
2) Start by putting date1 in calendar.
3) Add one month and result++;
4) If the result is > date2
       return result;
    else
       goto 3) again
0
 
zzynxSoftware engineerCommented:
Like this:

int result = 0;
Calendar cal = Calendar.getInstance();
cal.setTime( date1 );
while ( cal.getTime().before( date2 ) ) {
     result++;
     cal.add(Calendar.MONTH, 1);
}
return result;

(Didn't try it yet)
0
 
TimYatesCommented:
import java.util.* ;
import java.text.* ;

public class DateTest
{
  public static void doDates( Date date1, Date date2 )
  {
    Calendar old = Calendar.getInstance() ;
    old.setTime( date1 ) ;

    // set the calendar object representing the current date //
    Calendar now = Calendar.getInstance() ;
    now.setTime( date2 ) ;

    int ret = 0 ;
    while( old.before( now ) )
    {
      old.add( Calendar.MONTH, 1 ) ;
      ret++ ;
    }

    System.out.println( ret + " months" ) ;
  }

  public static void main( String[] args )
  {
    try
    {
      SimpleDateFormat sdf = new SimpleDateFormat( "dd/MM/yyyy" ) ;
      doDates( sdf.parse( "01/02/2004" ), sdf.parse( "02/03/2004" ) ) ;
    }
    catch( ParseException ex )
    {
    }
  }
}
0
 
TimYatesCommented:
LOL

Soz zzynx...
0
 
TimYatesCommented:
great minds think alike....and I typed too much... ;-)
0
 
zzynxSoftware engineerCommented:
>> great minds think alike....and I typed too much... ;-)
:°)

It works, but it seems that the time of date2 must be set to 00:00:00 too, to get the correct results:

        SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMdd HHmmss");
        Date date1 = null, date2 = null;
        try {
            date1 = fmt.parse("20040201 000000");        // <<<<<<<<<<<<< Here you can put in the dates you want to test
            date2 = fmt.parse("20040301 235959");        // <<<<<<<<<<<<< Here you can put in the dates you want to test
        } catch (ParseException ex) { }
       
        // date2 needs some tweaking
        Calendar calTmp = Calendar.getInstance();
        calTmp.setTime(date2);
        calTmp.set(Calendar.HOUR_OF_DAY, 0);
        calTmp.set(Calendar.MINUTE, 0);
        calTmp.set(Calendar.SECOND, 0);
        calTmp.set(Calendar.MILLISECOND, 0);
        date2 = calTmp.getTime();
       
        int result = 0;
        Calendar cal = Calendar.getInstance();
        cal.setTime( date1 );
        while ( !cal.getTime().after( date2 ) ) {
            result++;
            cal.add(Calendar.MONTH, 1);
        }
        System.out.println(result);

1-feb => 20-feb : 1
1-feb => 1-mar : 2
1-feb => 2-mar : 2
1-feb => 31-mar : 2
1-feb => 1-apr : 3
0
 
zzynxSoftware engineerCommented:
Is that the way you want it peter?
0
 
zzynxSoftware engineerCommented:
Mmmm. °blush°

I retested and it seem to give the expected result without that date2 tweaking too.
So, it looks like you can remove these lines again:

        // date2 needs some tweaking
        Calendar calTmp = Calendar.getInstance();
        calTmp.setTime(date2);
        calTmp.set(Calendar.HOUR_OF_DAY, 0);
        calTmp.set(Calendar.MINUTE, 0);
        calTmp.set(Calendar.SECOND, 0);
        calTmp.set(Calendar.MILLISECOND, 0);
        date2 = calTmp.getTime();
0
 
TimYatesCommented:
*giggle*
0
 
TimYatesCommented:
;-)
0
 
zzynxSoftware engineerCommented:
>> *giggle*

Look to your other Q's, you naughty boy!
;°D
0
 
peterwnormanAuthor Commented:
zzynx,
that's the way I want it.

thanks (sorry about the delay responding. users wanted a demo).
0
 
zzynxSoftware engineerCommented:
Great!
Thanks for accepting

(Although for the people after us reading this thread it would've been better to mark another comment as accepted answer)
0

Featured Post

Keep up with what's happening at Experts Exchange!

Sign up to receive Decoded, a new monthly digest with product updates, feature release info, continuing education opportunities, and more.

  • 10
  • 9
  • 3
Tackle projects and never again get stuck behind a technical roadblock.
Join Now