Testng 不正确的jodatime期间-年-月-天

Testng 不正确的jodatime期间-年-月-天,testng,jodatime,Testng,Jodatime,我使用jodatime创建了一个实用方法来计算日期差,并将其显示为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()

我使用jodatime创建了一个实用方法来计算日期差,并将其显示为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);
}
测试脚本使用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);
}
我注意到我的一些测试没有通过:

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
===============================================
我是使用了错误的方法还是jodatime中有bug


注意:我使用的是jodatime 2.3和testng 6.8.7。

不幸的是,Joda Time中的标准句点类型包括weeks yes-根本不直观,因此仅编写新的period From、to是不够的,而是使用带有显式句点类型参数的可选3-args-constructor,其中只指定年、月和日

解决方案:

Period period = 
  new Period(new LocalDate(start), new LocalDate(end), PeriodType.yearMonthDay());

不幸的是,Joda Time中的标准句点类型包括weeks yes-这一点都不直观,因此仅编写新的Periodfrom、to是不够的,而是使用带有显式句点类型参数的可选3-args-constructor,其中仅指定年、月和日

解决方案:

Period period = 
  new Period(new LocalDate(start), new LocalDate(end), PeriodType.yearMonthDay());

谢谢在我的例子中,当我将持续时间转换为期间时,我应该使用duration.toPeriodPEriodType.daysThanks。在我的情况下,当我将持续时间转换为期间时,我应该使用duration.toPeriodPEriodType.days