2

コードで次の支払い日を計算したいと思います。開始日があり、日、週、月、または年である支払い頻度があります。したがって、開始日が 2009 年 2 月 10 日で、支払い頻度が MONTH で、現在の日付が 2009 年 11 月 13 日である場合、次の支払い日は 2009 年 12 月 10 日になります。

これを解決するために、JDKデータクラスを使用していくつかの肉付きの良いコードをすでに書いています。しかし、システムの他の部分を Joda に移行したので、このコードを移行したいと考えています。

では、Joda の達人で簡単に行う方法を知っている人はいますか?

4

2 に答える 2

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

特に完全に恣意的な期間を取る必要がない場合は、力ずくでそれを行う方法が少ない可能性がありますが、これがおそらく最も簡単な解決策です。

于 2009-11-13T08:02:48.293 に答える
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));
}
于 2013-11-08T09:26:31.023 に答える