瀏覽代碼

Avoid bad rounding "1 year, 12 months" in date formatter

Round first, then calculate the labels. This avoids "x years, 12 months"
and instead produces "x+1 years".

One test case has been added for the original example the bug was found
with, and one assertion has been moved from an existing test case to the
new test case, since it also triggered the bug.

Bug: 525907
Change-Id: I3270af3850c4fb7bae9123a0a6582f93055c9780
Signed-off-by: Michael Keppler <Michael.Keppler@gmx.de>
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
tags/v4.9.1.201712030800-r
Michael Keppler 6 年之前
父節點
當前提交
e1a39cbbe7

+ 8
- 1
org.eclipse.jgit.test/tst/org/eclipse/jgit/util/RelativeDateFormatterTest.java 查看文件

@@ -128,7 +128,14 @@ public class RelativeDateFormatterTest {
assertFormat(380, DAY_IN_MILLIS, "1 year, 1 month ago");
assertFormat(410, DAY_IN_MILLIS, "1 year, 2 months ago");
assertFormat(2, YEAR_IN_MILLIS, "2 years ago");
assertFormat(1824, DAY_IN_MILLIS, "4 years, 12 months ago");
}

@Test
public void testFullYearMissingSomeDays() {
// avoid "x year(s), 12 months", as humans would always round this up to
// "x+1 years"
assertFormat(5 * 365 + 1, DAY_IN_MILLIS, "5 years ago");
assertFormat(2 * 365 - 10, DAY_IN_MILLIS, "2 years ago");
}

@Test

+ 3
- 2
org.eclipse.jgit/src/org/eclipse/jgit/util/RelativeDateFormatter.java 查看文件

@@ -114,10 +114,11 @@ public class RelativeDateFormatter {

// up to 5 years use "year, months" rounded to months
if (ageMillis < 5 * YEAR_IN_MILLIS) {
long years = ageMillis / YEAR_IN_MILLIS;
long years = round(ageMillis, MONTH_IN_MILLIS) / 12;
String yearLabel = (years > 1) ? JGitText.get().years : //
JGitText.get().year;
long months = round(ageMillis % YEAR_IN_MILLIS, MONTH_IN_MILLIS);
long months = round(ageMillis - years * YEAR_IN_MILLIS,
MONTH_IN_MILLIS);
String monthLabel = (months > 1) ? JGitText.get().months : //
(months == 1 ? JGitText.get().month : ""); //$NON-NLS-1$
return MessageFormat.format(

Loading…
取消
儲存