Лучший способ рассчитать следующую дату от начала плюс частота, используя время йода - PullRequest
2 голосов
/ 13 ноября 2009

Я хочу определить следующую дату платежа в моем коде. У меня есть дата начала, и у меня есть периодичность оплаты, которая может быть ДЕНЬ, НЕДЕЛЯ, МЕСЯЦ или ГОД. Так, если начальная дата была 10 февраля 2009 года и имела периодичность платежа МЕСЯЦ, а текущая дата - 13 ноября 2009 года, то следующая дата платежа будет 10 декабря 2009

Я уже написал некоторый мясной код, используя классы данных JDK, чтобы решить это. Но мы переместили другие части системы в Joda, и я хотел бы перенести этот код в.

Так знает ли какой-нибудь гуру Джода, как это легко сделать?

Ответы [ 2 ]

4 голосов
/ 13 ноября 2009

Вот метод грубой силы (игнорируя рабочие дни и т. Д.). Обратите внимание, что вы не можете просто повторно добавить период, как (30 января + 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);
        }
    }
}

Возможно, что есть меньше способов сделать это грубо, особенно если вам не нужно брать произвольный период, но это, вероятно, самое простое решение.

0 голосов
/ 08 ноября 2013

Просто собрать комментарии

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