Author: adrianc
Date: Wed Feb 17 20:10:53 2010
New Revision: 911164
URL: http://svn.apache.org/viewvc?rev=911164&view=rev
Log:
Hand-ported TimeDuration.java bug fixes from trunk:
1. Fixed a bug in TimeDuration.java reported by Adam Heath on the dev mailing
list. The elapsed time constructor would produce an incorrect duration if
either Calendar was prior to the epoch.
2. Fix for dealing with calendar dates that have a DAY value that is in the
special window of 29-31.
Modified:
ofbiz/branches/release09.04/framework/base/src/org/ofbiz/base/util/TimeDuration.java
Modified:
ofbiz/branches/release09.04/framework/base/src/org/ofbiz/base/util/TimeDuration.java
URL:
http://svn.apache.org/viewvc/ofbiz/branches/release09.04/framework/base/src/org/ofbiz/base/util/TimeDuration.java?rev=911164&r1=911163&r2=911164&view=diff
==============================================================================
---
ofbiz/branches/release09.04/framework/base/src/org/ofbiz/base/util/TimeDuration.java
(original)
+++
ofbiz/branches/release09.04/framework/base/src/org/ofbiz/base/util/TimeDuration.java
Wed Feb 17 20:10:53 2010
@@ -27,6 +27,13 @@
/** A <code>TimeDuration</code> instance that represents a zero time
duration. */
public static final TimeDuration ZeroTimeDuration = new NullDuration();
+ private static long computeDeltaMillis(long start, long end) {
+ if (start < 0) {
+ return end + (-start);
+ }
+ return end - start;
+ }
+
protected int millis = 0;
protected int seconds = 0;
protected int minutes = 0;
@@ -76,7 +83,7 @@
return this.years == that.years && this.months == that.months &&
this.days == that.days
&& this.hours == that.hours && this.minutes == that.minutes &&
this.seconds == that.seconds
&& this.millis == that.millis;
- } catch (Exception e) {}
+ } catch (ClassCastException e) {}
return false;
}
@@ -151,7 +158,7 @@
// this will be used to speed up time comparisons
long targetMillis = calEnd.getTimeInMillis();
- long deltaMillis = targetMillis - calStart.getTimeInMillis();
+ long deltaMillis = computeDeltaMillis(calStart.getTimeInMillis(),
targetMillis);
// shortcut for equal dates
if (deltaMillis == 0) {
@@ -162,33 +169,33 @@
long yearMillis = 86400000 * calStart.getMinimum(Calendar.DAY_OF_YEAR);
float units = deltaMillis / yearMillis;
this.years = advanceCalendar(calStart, calEnd, (int) units,
Calendar.YEAR);
- deltaMillis = targetMillis - calStart.getTimeInMillis();
+ deltaMillis = computeDeltaMillis(calStart.getTimeInMillis(),
targetMillis);
// compute elapsed months
long monthMillis = 86400000 *
calStart.getMinimum(Calendar.DAY_OF_MONTH);
units = deltaMillis / monthMillis;
this.months = advanceCalendar(calStart, calEnd, (int) units,
Calendar.MONTH);
- deltaMillis = targetMillis - calStart.getTimeInMillis();
+ deltaMillis = computeDeltaMillis(calStart.getTimeInMillis(),
targetMillis);
// compute elapsed days
units = deltaMillis / 86400000;
this.days = advanceCalendar(calStart, calEnd, (int) units,
Calendar.DAY_OF_MONTH);
- deltaMillis = targetMillis - calStart.getTimeInMillis();
+ deltaMillis = computeDeltaMillis(calStart.getTimeInMillis(),
targetMillis);
// compute elapsed hours
units = deltaMillis / 3600000;
this.hours = advanceCalendar(calStart, calEnd, (int) units,
Calendar.HOUR);
- deltaMillis = targetMillis - calStart.getTimeInMillis();
+ deltaMillis = computeDeltaMillis(calStart.getTimeInMillis(),
targetMillis);
// compute elapsed minutes
units = deltaMillis / 60000;
this.minutes = advanceCalendar(calStart, calEnd, (int) units,
Calendar.MINUTE);
- deltaMillis = targetMillis - calStart.getTimeInMillis();
+ deltaMillis = computeDeltaMillis(calStart.getTimeInMillis(),
targetMillis);
// compute elapsed seconds
units = deltaMillis / 1000;
this.seconds = advanceCalendar(calStart, calEnd, (int) units,
Calendar.SECOND);
- deltaMillis = targetMillis - calStart.getTimeInMillis();
+ deltaMillis = computeDeltaMillis(calStart.getTimeInMillis(),
targetMillis);
this.millis = (int) deltaMillis;
if (isNegative) {
@@ -198,11 +205,15 @@
protected int advanceCalendar(Calendar start, Calendar end, int units, int
type) {
if (units >= 1) {
- start.add(type, units);
- while (start.after(end)) {
- start.add(type, -1);
+ Calendar tmp = (Calendar) start.clone();
+ tmp.add(type, units);
+ while (tmp.after(end)) {
+ tmp.add(type, -1);
units--;
}
+ if (units != 0) {
+ start.add(type, units);
+ }
}
return units;
}