[
https://issues.apache.org/jira/browse/LANG-1629?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17252155#comment-17252155
]
Bruno P. Kinoshita commented on LANG-1629:
------------------------------------------
Hi [~helloJuhyun] ,
Would you be able to provide a code snippet to reproduce the issue? I tried
with `DurationFormatUtils.formatPeriod(-1, 1, "", true,
TimeZone.getDefault());` and `DurationFormatUtils.formatPeriod(-1, -1, "",
true, TimeZone.getDefault());` using the code on `master`, but I couldn't
reproduce the issue.
>How about putting in a validation to determine whether it's negative or
>positive?
If someone is able to reproduce your issue (preferably with a unit test, to add
to DurationFormatUtilsTest.java), then I think we should validate it to prevent
infinite-loops.
And in case you are interested on working on this feature, feel free to submit
a pull request :)
Cheers
Bruno
> 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
> Priority: Major
> 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)