使用joda时间从开始加频率计算下一个日期的最佳方法

时间:2009-11-13 07:26:45

标签: java jodatime

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

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

所有Joda大师都知道如何轻松地做到这一点吗?

2 个答案:

答案 0 :(得分:4)

这是一种蛮力方法(忽略工作日等)。请注意,您不能只重复添加期间(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);
        }
    }
}

可能有更少的蛮力方式 - 特别是如果你不必完全采取任意时期 - 但这可能是最简单的解决方案。

答案 1 :(得分:0)

将评论整理在一起

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));
}