2009-11-13 10 views
2

Je veux travailler sur la prochaine date de paiement dans mon code. J'ai une date de début et j'ai une fréquence de paiement qui peut être le jour, la semaine, le mois ou l'année. Donc, si la date de début était le 10 février 2009 et avait une fréquence de paiement de MOIS et la date actuelle est le 13 NOV 2009 alors la prochaine date de paiement serait 10 DEC 2009Meilleur moyen de calculer la date suivante à partir du début, plus la fréquence en utilisant le temps joda

J'ai déjà écrit du code charnu en utilisant des classes de données JDK pour travailler cela. Mais nous avons déplacé d'autres parties du système vers Joda et je voudrais donc migrer ce code.

Tout gourou Joda sait-il comment le faire facilement?

+0

Les paiements autorisés que les jours de travail? –

Répondre

4

Voici une méthode de force brute (en ignorant les jours de travail, etc.). Notez que vous ne pouvez pas ajouter la période à plusieurs reprises, comme (30 janvier + 1 mois) + 1 mois! = 30 janvier + 2 mois.

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

Il est possible qu'il y ait moins de moyens de force brute de le faire - surtout si vous ne devez pas être en mesure de prendre une période tout à fait arbitraire - mais cela est probablement la solution la plus simple.

+0

Merci Jon. Cela m'a donné quelques idées. Je pensais de cette façon que pensez-vous. L'exemple suppose que la fréquence est mois Tout d'abord je reçois les mois entre les deux dates de début et aujourd'hui int monthsCount = Months.monthsBetween (début, aujourd'hui) .getMonths(); alors j'ajouter les mois peut-être comme ceci: nextDate = start.plus (Period.months (monthsCount + 1)) whould que le travail? –

+0

Je suggère d'utiliser moisBetween pour obtenir une première "estimation" (x dire) - et ensuite essayer que x-1, x et x + 1. C'est bon marché à faire, et cela évite les cas subtils de coin. –

0

Juste mettre ensemble les commentaires

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