2013-10-18 65 views
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个月等)

+0

那么没有一天没有结帐的条件呢?什么是'toPeriod()'? – clwhisk

+0

@clwhisk抱歉,你能提供一个你的意思吗? – MxyL

+0

我想我明白你的意思。例如,如果一个时期是1月1日到1月25日,下一个时期是2月1日到2月25日,并且它们仍然是“有效”的,因为中间的失踪日期不计算在内。 – MxyL

回答

1

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

LocalDate endDate1, startDate2... 

startDate2.minusDays(1).equals(endDate1) 
+0

哦,这将解决问题,假设所有账单期间一致。 – MxyL

1

Interval

如果您切换到使用特定时刻(DateTime对象),而不是LocalDate对象,你可以使用Interval类跟踪的时间跨度与启动和停止的时刻。小费,如果你走这条路:DateTime::withTimeAtStartOfDay方法。

Interval类有方便的比较方法,例如abutsgapoverlaps,和contains。第一个,abuts,就是你要找的。

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

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