【问题标题】:Comparing date periods and date period lengths比较日期期间和日期期间长度
【发布时间】:2013-10-18 18:18:09
【问题描述】:

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

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

【问题讨论】:

  • 无天未结账的情况怎么办? toPeriod() 是什么?
  • @clwhisk 抱歉,您能举例说明您的意思吗?
  • 我想我明白你的意思了。例如,如果一个时期是 1 月 1 日到 1 月 25 日,而下一个时期是 2 月 1 日到 2 月 25 日,并且它们仍然“有效”,因为不计算其间的缺失天数。
  • 这不是我的意思——基本上和 dkatzel 一样。这些问题是关于你的意思。

标签: java jodatime


【解决方案1】:

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

LocalDate endDate1, startDate2...

startDate2.minusDays(1).equals(endDate1)

【讨论】:

  • 哦,这会解决问题,假设所有账单周期都是一致的。
【解决方案2】:

Interval

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

Interval 类具有方便的比较方法,例如 abuts、gap、overlaps 和 contains。第一个 abuts 就是您要查找的内容。

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

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

【讨论】:

    猜你喜欢
    • 2015-07-20
    • 1970-01-01
    • 1970-01-01
    • 2012-02-07
    • 1970-01-01
    • 1970-01-01
    • 2016-09-19
    • 1970-01-01
    • 2020-12-16
    相关资源
    最近更新 更多