diff --git a/src/java/org/apache/commons/lang/time/DateUtils.java b/src/java/org/apache/commons/lang/time/DateUtils.java index ebe74bdd7..ec386af29 100644 --- a/src/java/org/apache/commons/lang/time/DateUtils.java +++ b/src/java/org/apache/commons/lang/time/DateUtils.java @@ -31,7 +31,7 @@ * @author Gary Gregory * @author Phil Steitz * @since 2.0 - * @version $Id: DateUtils.java,v 1.29 2004/09/26 05:45:33 bayard Exp $ + * @version $Id: DateUtils.java,v 1.30 2004/09/27 03:14:15 bayard Exp $ */ public class DateUtils { @@ -56,10 +56,6 @@ public class DateUtils { */ public static final long MILLIS_PER_DAY = 24 * MILLIS_PER_HOUR; - // hmm. not very accurate. used by DurationFormatUtils - static final long MILLIS_PER_YEAR = 365 * MILLIS_PER_DAY + 6 * MILLIS_PER_HOUR; - static final long MILLIS_PER_MONTH = MILLIS_PER_YEAR / 12; - /** * This is half a month, so this represents whether a date is in the top * or bottom half of the month. diff --git a/src/java/org/apache/commons/lang/time/DurationFormatUtils.java b/src/java/org/apache/commons/lang/time/DurationFormatUtils.java index ebe97dfb7..54b862f6c 100644 --- a/src/java/org/apache/commons/lang/time/DurationFormatUtils.java +++ b/src/java/org/apache/commons/lang/time/DurationFormatUtils.java @@ -17,6 +17,9 @@ import org.apache.commons.lang.StringUtils; +import java.util.Calendar; +import java.util.TimeZone; + /** *
Duration formatting utilities and constants.
* @@ -27,7 +30,7 @@ * @author Gary Gregory * @author Henri Yandell * @since 2.1 - * @version $Id: DurationFormatUtils.java,v 1.14 2004/09/26 05:45:33 bayard Exp $ + * @version $Id: DurationFormatUtils.java,v 1.15 2004/09/27 03:14:15 bayard Exp $ */ public class DurationFormatUtils { @@ -101,9 +104,18 @@ public static String format(long millis, String format) { return format(millis, format, true); } public static String format(long millis, String format, boolean padWithZeros) { - StringBuffer buffer = new StringBuffer(); + return format(millis, format, padWithZeros, TimeZone.getDefault()); + } + public static String format(long millis, String format, boolean padWithZeros, TimeZone timezone) { + + if(millis > 28 * DateUtils.MILLIS_PER_DAY) { + Calendar c = Calendar.getInstance(timezone); + c.set(1970, 0, 1, 0, 0, 0); + c.set(Calendar.MILLISECOND, 0); + return format(c.getTime().getTime(), millis, format, padWithZeros, timezone); + } + Token[] tokens = lexx(format); - int sz = tokens.length; int years = 0; int months = 0; @@ -113,6 +125,7 @@ public static String format(long millis, String format, boolean padWithZeros) { int seconds = 0; int milliseconds = 0; + /* This will never be evaluated if(Token.containsTokenWithValue(tokens, y) ) { years = (int) (millis / DateUtils.MILLIS_PER_YEAR); millis = millis - (years * DateUtils.MILLIS_PER_YEAR); @@ -126,6 +139,7 @@ public static String format(long millis, String format, boolean padWithZeros) { months = 0; } } + */ if(Token.containsTokenWithValue(tokens, d) ) { days = (int) (millis / DateUtils.MILLIS_PER_DAY); millis = millis - (days * DateUtils.MILLIS_PER_DAY); @@ -146,7 +160,15 @@ public static String format(long millis, String format, boolean padWithZeros) { milliseconds = (int) millis; } + return formatDuration(tokens, years, months, days, hours, minutes, seconds, milliseconds, padWithZeros); + } + + private static String formatDuration(Token[] tokens, int years, int months, int days, int hours, + int minutes, int seconds, int milliseconds, boolean padWithZeros) + { + StringBuffer buffer = new StringBuffer(); + int sz = tokens.length; for(int i=0; i