比较日期和日期时长

时间:2013-10-18 18:18:10

标签: java jodatime

假设我有一些账单包含一些开始日期和结束日期。

Mar 10 to Apr 9
Apr 10 to May 9
May 10 to Jun 9

我想检查的业务规则是

for any given bill, the previous bill is exactly one period behind

所以例如,3月10日到4月9日相隔大约一个月,所以我用它来检查任何两个连续的账单开始日期(4月10日对3月10日)是相隔大约一个月。

现在我遇到的问题是获得期限的长度。例如,假设我有以下数据集

Jan 1 to Jan 31
Feb 1 to Feb 28
Mar 1 to Mar 31

我正在使用JodaTime库,所以我说的是

DateTimeFormatter formatter = DateTimeFormat.forPattern("dd/MM/yyyy");
DateTime date1 = formatter.parseDateTime("01/01/2013");
DateTime date2 = formatter.parseDateTime("31/01/2013");
System.out.println(Months.monthsBetween(date1, date2).toPeriod().getMonths());

然后返回0,这是正确的,但没有用。

DateTimeFormatter formatter = DateTimeFormat.forPattern("dd/MM/yyyy");
DateTime date1 = formatter.parseDateTime("31/01/2013");
DateTime date2 = formatter.parseDateTime("01/02/2013");
System.out.println(Months.monthsBetween(date1, date2).toPeriod().getMonths());

即使它相隔一天,它也会返回1。

有什么更好的方法可以做到这一点?我可以查看天差,但由于计费周期以月为单位指定,我希望任何输出都是一致的(例如:这些账单不是x个月等,等等)

2 个答案:

答案 0 :(得分:1)

为什么不检查一个期间减去一天的开始日期是否等于上一期间的结束日期?

LocalDate endDate1, startDate2...

startDate2.minusDays(1).equals(endDate1)

答案 1 :(得分:1)

Interval

如果您切换到使用特定时刻(DateTime个对象)而不是LocalDate个对象,则可以使用Interval类来跟踪开始和停止时刻的时间跨度。提示,如果你这样做:DateTime::withTimeAtStartOfDay方法。

Interval类具有便捷的比较方法,例如abutsgapoverlapscontains。第一个是abuts,是您正在寻找的。

如果您想坚持使用LocalDate个对象,您可以构建自己的小DateRange类,行为与Interval类似。您甚至可以在Stack Overflow上找到一些示例代码。

顺便说一句,Joda-Time项目现在处于维护模式,团队建议迁移到java.time类。 java.time类由ThreeTen-Extra项目扩展。该项目提供类似于Joda-Time Interval的{​​{1}}类。