2016-11-30 6 views
1

Mit JodaTime ich zur Zeit die Anzahl der Tage zwischen Startdatum und Enddatum wie folgt bin Überprüfung:JodaTime: get Datum (n) zwischen zwei Terminen bestimmtes Intervall mit

todayDate = new DateTime(); 
expiryDate = new DateTime(dbReportModel.getValidityTime()); 
lastDate = new DateTime(dbReportModel.getLastDate()); 

Days dayDifference = Days.daysBetween(new LocalDate(todayDate), new LocalDate(expiryDate)); 

beginne ich meine Benutzer über etwas zu informieren, wenn die oben genannten Tag Differenz kleiner oder gleich, dass einige int Tage:

if (dayDifference.getDays() <= expiryNotificationProperties.getDaysBefore()) 

das Programm jeden Tag lief wird. Das Problem ist, dass ich nicht jeden Tag Informationen senden muss. Ich muss nur jeden f. 15 Tage.

Zur Zeit habe ich diese Methode eine Liste von Daten zu erhalten, die zwischen dem angegebenen Start- und Enddatum sind mit dem Intervall:

private List<LocalDate> getDatesBetweenExpiryDateTodayDate (DateTime todayDate, DateTime expiryDate, int interval) { 
     List<LocalDate> listOfDatesWithInterval = new ArrayList <>(); 
     int numberOfDays = Days.daysBetween(new LocalDate(todayDate), new LocalDate(expiryDate)).getDays(); 
     LocalDate dynamicExpiryDate = expiryDate.toLocalDate(); 
     while (numberOfDays > 0) { 
      listOfDatesWithInterval.add(dynamicExpiryDate.minusDays(interval)); 
      dynamicExpiryDate = dynamicExpiryDate.minusDays(interval); 
      numberOfDays -= interval; 
     } 

     return listOfDatesWithInterval; 
    } 

Und das ist das, dass die heutige zusätzliche überprüft Datum in der Liste enthalten ist:

List<LocalDate> listOfDatesUsingInterval = getDatesBetweenExpiryDateTodayDate(todayDate, expiryDate, interval); 
if (listOfDatesUsingInterval.contains(todayDate.toLocalDate())) { 

Ist es möglich, in vielleicht eine bessere Art und Weise dies in JodaTime zu tun? Gibt es eine eingebaute Funktionalität, um dieses Ergebnis zu erreichen?

+0

Warum funktioniert es nicht? – lexicore

+0

@lexicore Es funktioniert. Ich habe den Beitrag bearbeitet. Gibt es eine bessere Möglichkeit, diese Funktionalität zu implementieren? –

+0

Ich glaube nicht, dass es einen viel besseren Weg gibt. Die API bietet keine solche Funktionalität OOTB und Sie landen auf die eine oder andere Weise auf "StartDate + DayIndex" -Ansatz. – lexicore

Antwort

2

Wenn Sie konnte nicht Java8 verwenden versuchen Google Guava zu verwenden:

private static void getDays(DateTime todayDate, DateTime expiryDate, int interval) { 
      int numberOfDays = Days.daysBetween(new LocalDate(todayDate), new LocalDate(expiryDate)).getDays(); 
      Range<Integer> open = Range.closed(1, numberOfDays/interval); 
      ImmutableList<Integer> integers = ContiguousSet.create(open, DiscreteDomain.integers()).asList(); 
      FluentIterable.from(integers).transform(new ConvertToDate(interval)).toList().forEach(System.out::println); 
} 

private static class ConvertToDate implements Function<Integer, DateTime> { 
    private final int interval; 

    public ConvertToDate(int interval) { 
     this.interval = interval; 
    } 

    @Override 
    public DateTime apply(Integer integer) { 
     return DateTime.now().plusDays(integer* interval); 
    } 
} 

Ich weiß nicht, ob es bessere Lösung ist, aber ich finde es einfacher ist, lesen.

1

Sie können Streams

int numberOfDays = Days.daysBetween(LocalDate.now(), LocalDate.now().plusDays(10)).getDays(); 
    List<LocalDate> collect = Stream.iterate(LocalDate.now(), e -> e.plusDays(1)).limit(numberOfDays).collect(Collectors.toList()); 
    collect.forEach(System.out::println); 
+0

Sieht so aus, als würde ich den Job machen, obwohl ich Java 8 in diesem Projekt nicht verwenden kann. –

Verwandte Themen