我使用jodatime创建了一个Utility方法来计算日期差异并显示它,例如3y 2m 4d.
这是我的方法:
public static String dateBetween(Object start, Object end) {
Period period = new Period(new LocalDate(start), new LocalDate(end));
PeriodFormatter formatter = new PeriodFormatterBuilder()
.printZeroAlways()
.appendYears().appendSuffix("y ")
.appendMonths().appendSuffix("m ")
.appendDays().appendSuffix("d")
.toFormatter();
return formatter.print(period);
}
Run Code Online (Sandbox Code Playgroud)
使用testng创建测试脚本如下:
@DataProvider(name = "dateBetweenData")
public static Object[][] dateBetweenData() {
return new Object[][] {
{ "01/08/2010", "02/07/2012", "1y 11m 1d" },
{ "01/08/2010", "03/07/2012", "1y 11m 2d" },
{ "01/08/2010", "11/07/2012", "1y 11m 10d" },
{ "01/08/2010", "21/07/2012", "1y 11m 20d" },
{ "01/08/2010", "31/07/2012", "1y 11m 30d" },
};
}
@Test(dataProvider="dateBetweenData")
public void dateBetween(String startDate, String endDate, String expected) throws ParseException {
DateFormat format = new SimpleDateFormat("dd/MM/yyyy");
Assert.assertEquals(
DateUtil.dateBetween(format.parse(startDate), format.parse(endDate)),
expected);
}
Run Code Online (Sandbox Code Playgroud)
我注意到我的一些测试失败了:
PASSED: dateBetween("01/08/2010", "02/07/2012", "1y 11m 1d")
PASSED: dateBetween("01/08/2010", "03/07/2012", "1y 11m 2d")
FAILED: dateBetween("01/08/2010", "11/07/2012", "1y 11m 10d")
java.lang.AssertionError: expected [1y 11m 10d] but found [1y 11m 3d]
...
FAILED: dateBetween("01/08/2010", "21/07/2012", "1y 11m 20d")
java.lang.AssertionError: expected [1y 11m 20d] but found [1y 11m 6d]
...
FAILED: dateBetween("01/08/2010", "31/07/2012", "1y 11m 30d")
java.lang.AssertionError: expected [1y 11m 30d] but found [1y 11m 2d]
...
===============================================
Default test
Tests run: 5, Failures: 3, Skips: 0
===============================================
Run Code Online (Sandbox Code Playgroud)
我使用错误的方法还是jodatime中的错误?
注意:我正在使用jodatime 2.3和testng 6.8.7.
不幸的是,Joda Time中的标准句点类型包括几周(是的 - 根本不直观,因此仅仅编写新的Period(from,to)是不够的,但是使用具有显式句点类型参数的备选3-args-constructor您只能指定年,月和日的地方.
解:
Period period =
new Period(new LocalDate(start), new LocalDate(end), PeriodType.yearMonthDay());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
874 次 |
| 最近记录: |