Лучший способ рассчитать следующую дату от начала плюс частота, используя время joda

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

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

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


person Peter Delahunty    schedule 13.11.2009    source источник
comment
Возможны ли платежи только в рабочие дни?   -  person Thomas Jung    schedule 13.11.2009


Ответы (2)


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

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

person Jon Skeet    schedule 13.11.2009
comment
Спасибо, Джон. это дало мне некоторые идеи. Я думал об этом так, что вы думаете. В примере предполагается, что частота составляет месяцы. Сначала я получаю месяцы между двумя датами начала и сегодняшнего дня int monthsCount = Months.monthsBetween (start, today) .getMonths (); тогда я добавляю месяцы, может быть, вот так: nextDate = start.plus (Period.months (monthsCount + 1)), а что сработает? - person Peter Delahunty; 13.11.2009
comment
Я бы предложил использовать monthsBetween, чтобы получить первоначальное предположение (скажем, x), а затем попробовать эти x-1, x и x + 1. Это дешево и позволяет избежать сложных угловых ситуаций. - person Jon Skeet; 13.11.2009

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

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));
}
person Sudarshan    schedule 08.11.2013