LeeJuHyun created LANG-1629:
-------------------------------

             Summary: DurationFormatUtils.formatPeriod is infinite repetition 
when parameter is negative number
                 Key: LANG-1629
                 URL: https://issues.apache.org/jira/browse/LANG-1629
             Project: Commons Lang
          Issue Type: Bug
          Components: lang.time.*
    Affects Versions: 3.11
            Reporter: LeeJuHyun
             Fix For: Discussion


if parameter number(*startMillis*, *endMillis*) is negative number then below 
while loop is infinite repetition. (278 line ~)
{code:java}
public static String formatPeriod(final long startMillis, final long endMillis, 
final String format, final boolean padWithZeros,
        final TimeZone timezone) {
    Validate.isTrue(startMillis <= endMillis, "startMillis must not be greater 
than endMillis");


    // Used to optimise for differences under 28 days and
    // called formatDuration(millis, format); however this did not work
    // over leap years.
    // TODO: Compare performance to see if anything was lost by
    // losing this optimisation.

    final Token[] tokens = lexx(format); 
    // ...
    while (start.get(Calendar.YEAR) != target) {
    days += start.getActualMaximum(Calendar.DAY_OF_YEAR) - 
start.get(Calendar.DAY_OF_YEAR);

    // Not sure I grok why this is needed, but the brutal tests show it is
    if (start instanceof GregorianCalendar &&
            start.get(Calendar.MONTH) == Calendar.FEBRUARY &&
            start.get(Calendar.DAY_OF_MONTH) == 29) {
        days += 1;
    }

    start.add(Calendar.YEAR, 1);

    days += start.get(Calendar.DAY_OF_YEAR);
}{code}
 

How about putting in a validation to determine whether it's negative or 
positive?

 

thank you :)

 

 



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to