|
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; } |
| Free forum by Nabble | Edit this page |
