0

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

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 个月等)

4

2 回答 2

1

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

LocalDate endDate1, startDate2...

startDate2.minusDays(1).equals(endDate1)
于 2013-10-18T19:44:15.977 回答
1

Interval

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

该类Interval具有方便的比较方法,例如abutsgapoverlapscontains。第一个,abuts,是您要查找的内容。

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

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

于 2016-08-25T01:01:35.880 回答