【问题标题】:Best way to calculate next date from start plus frequency using joda time使用 joda 时间计算从开始到频率的下一个日期的最佳方法
【发布时间】:2013-11-08 17:26:31
【问题描述】:

我想在我的代码中计算出下一个付款日期。我有一个开始日期,我有一个付款频率,可以是 DAY、WEEK、MONTH 或 YEAR。因此,如果开始日期为 2009 年 2 月 10 日并且付款频率为 MONTH,当前日期为 2009 年 11 月 13 日,那么下一个付款日期将为 2009 年 12 月 10 日

我已经使用 JDK 数据类编写了一些丰富的代码来解决这个问题。但是我们已将系统的其他部分移至 Joda,因此我想将此代码迁移到。

那么有没有 Joda 大师知道如何轻松做到这一点?

【问题讨论】:

  • 是否只允许在工作日付款?

标签: java jodatime


【解决方案1】:

这是一种蛮力方法(忽略工作日等)。请注意,您不能只是重复添加时间段,如 (1 月 30 日 + 1 个月) + 1 个月!= 1 月 30 日 + 2 个月。

import org.joda.time.LocalDate;
import org.joda.time.Period;

public class Test {
    public static void main(String[] args) {
        LocalDate start = new LocalDate(2009, 2, 10);
        LocalDate now = new LocalDate(2009, 11, 13);
        System.out.println(next(start, Period.months(1), now));
    }

    public static LocalDate next(LocalDate start, Period period, LocalDate now) {
        Period current = Period.ZERO;
        while (true) {
            LocalDate candidate = start.plus(current);
            if (candidate.isAfter(now)) {
                return candidate;
            }
            current = current.plus(period);
        }
    }
}

可能有较少的蛮力方法来做到这一点 - 特别是如果您不必能够完全任意地进行一段时间 - 但这可能是最简单的解决方案。

【讨论】:

  • 谢谢乔恩。这给了我一些想法。我就是这么想的,你怎么看。该示例假设频率是几个月首先我得到两个日期开始和今天之间的月份 int monthsCount = Months.monthsBetween(start,today).getMonths();然后我添加月份可能是这样的:nextDate = start.plus(Period.months(monthsCount + 1)) 这行得通吗?
  • 我建议使用monthsBetween 得到一个初始的“猜测”(x 说)——然后尝试x-1、x 和x+1。这样做很便宜,而且避免了微妙的极端情况。
【解决方案2】:

只是把 cmets 放在一起

public static void main(String[] args) {
    LocalDate date = LocalDate.parse("03-10-2010",Constants.DEFAULT_DATE_FORMAT);

    Months gap = Months.monthsBetween(date,LocalDate.now());
    System.out.println(Months.monthsBetween(date,LocalDate.now()));
    System.out.println("Cycle Start " + date.plusMonths(gap.getMonths()));
    System.out.println("Cycle End " + date.plusMonths(gap.getMonths()+1));
}

【讨论】:

    猜你喜欢
    • 2013-10-15
    • 1970-01-01
    • 1970-01-01
    • 2020-09-23
    • 2020-07-20
    • 1970-01-01
    • 2010-10-08
    • 1970-01-01
    • 2015-09-21
    相关资源
    最近更新 更多