 <p>My <a href="http://stackoverflow.com/a/26320857/642706">other answer</a> correctly solves the direct problem raised in the Question. This answer is a bonus, an alternate avenue to accomplish the goal of calculating and applying elapsed time.</p> <p>Doing this kind of date-time work is much easier if using either of these libraries:</p> <ul> <li><a href="http://www.joda.org/joda-time/" rel="nofollow">Joda-Time</a></li> <li><a href="http://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html" rel="nofollow">java.time package</a><br/>(built into Java 8, inspired by Joda-Time, defined by <a href="https://jcp.org/en/jsr/detail?id=310" rel="nofollow">JSR 310</a>)</li> </ul> <p>The old date-time classes (java.util.Date, .Calendar, java.text.SimpleDateFormat) bundled with Java are notoriously troublesome, confusing, and flawed. Avoid them. If required you can convert to-and-fro with either library listed above.</p> <h1>Joda-Time</h1> <p>The code example below is using Joda-Time 2.5.</p> <h2>Elapsed Time</h2> <p>You can count elapsed time in either of two ways: </p> <ul> <li><strong>Calendar</strong> style<br/>Number of months, weeks, days, and such.</li> <li><strong>Stopwatch</strong> style<br/>Total number of milliseconds, as if measured with a running <a href="http://en.wikipedia.org/wiki/Stopwatch" rel="nofollow">stopwatch</a>.</li> </ul> <p>These two ways to measure elapsed time may give different results! This code example shows both.</p> <h2>Time Zone</h2> <p>Unlike j.u.Date, a <code>DateTime</code> object in Joda-Time actually knows its own assigned time zone. That is crucial if you count elapsed time by the calendar style (months, days, and so on). Note how this example uses Montréal, Québec time zone (arbitrarily chosen).</p> <h2>Example Code</h2> <pre><code>// Simulate inputs, a trio of java.util.Date objects. java.util.Date dateStart = new DateTime( 2014 , 1 , 2 , 0 , 0 , 0 , DateTimeZone.UTC ).toDate(); java.util.Date dateStop = new DateTime( 2014 , 3 , 2 , 0 , 0 , 0 , DateTimeZone.UTC ).toDate(); java.util.Date dateTarget = new DateTime( 2014 , 7 , 1 , 0 , 0 , 0 , DateTimeZone.UTC ).toDate(); // Convert inputs to Joda-Time DateTimeZone timeZone = DateTimeZone.forID( "America/Montreal" ); // Or DateTimeZone.UTC. DateTime start = new DateTime( dateStart , timeZone ); DateTime stop = new DateTime( dateStop , timeZone ); DateTime target = new DateTime( dateTarget , timeZone ); // Determine elapsed time in three fashions: (a) pair of points on timeline, (b) An amount of weeks, days, hours, and such, and (c) actual milliseconds. Interval interval = new Interval( start , stop ); Period period = interval.toPeriod(); Duration duration = interval.toDuration(); // Add elapsed time to target date-time. Show results of adding either period or duration. DateTime laterByPeriod = target.plus( period ); DateTime laterByDuration = target.plus( duration ); </code></pre> <p>Dump to console.</p> <pre><code>System.out.println( "dateStart: " + dateStart ); // BEWARE: j.u.Date objects are in UTC by definition, but "toString" method applies the JVM's current default time zone. Misleading! System.out.println( "dateStop: " + dateStop ); System.out.println( "dateTarget: " + dateTarget ); System.out.println( "start: " + start ); System.out.println( "stop: " + stop ); System.out.println( "target: " + target ); System.out.println( "interval: " + interval ); System.out.println( "period: " + period ); System.out.println( "duration: " + duration ); System.out.println( "laterByPeriod: " + laterByPeriod ); // Notice the change in offset because of DST (Daylight Saving Time) in Québec. System.out.println( "laterByDuration: " + laterByDuration ); </code></pre> <p>When run.</p> <pre class="lang-none prettyprint-override"><code>dateStart: Wed Jan 01 16:00:00 PST 2014 dateStop: Sat Mar 01 16:00:00 PST 2014 dateTarget: Mon Jun 30 17:00:00 PDT 2014 start: 2014-01-01T19:00:00.000-05:00 stop: 2014-03-01T19:00:00.000-05:00 target: 2014-06-30T20:00:00.000-04:00 interval: 2014-01-01T19:00:00.000-05:00/2014-03-01T19:00:00.000-05:00 period: P2M duration: PT5097600S laterByPeriod: 2014-08-30T20:00:00.000-04:00 laterByDuration: 2014-08-28T20:00:00.000-04:00 </code></pre>