2009-07-23 15 views
12

Próbuję bezskutecznie wdrożyć iterator Date z czasem Joda.
Potrzebuję czegoś, co pozwala mi na powtarzanie wszystkich dni od daty rozpoczęcia do daty zakończenia
Czy masz pojęcie, jak to zrobić?Java Joda Time - Implementowanie iteratora zakresu dat

+2

Ta pomoc w ogóle? http://stackoverflow.com/questions/847520/java-date-iterator-factory-with-rules-specifying-how-to-calculate-the-intervals – Davis

+2

Jeśli chcesz dni, chcesz spojrzeć na klasę LocalDate (ustaw jako datę początkową) i zrób co najmniej dni dla każdego następnego. Zapobiegnie to natychmiastowym problemom ze strefą czasową. – Yishai

Odpowiedz

28

Oto coś, od czego zaczniesz. Może warto pomyśleć o tym, czy ma to być ekskluzywny włącznie lub na końcu, itp

import org.joda.time.*; 
import java.util.*; 

class LocalDateRange implements Iterable<LocalDate> 
{ 
    private final LocalDate start; 
    private final LocalDate end; 

    public LocalDateRange(LocalDate start, 
          LocalDate end) 
    { 
     this.start = start; 
     this.end = end; 
    } 

    public Iterator<LocalDate> iterator() 
    { 
     return new LocalDateRangeIterator(start, end); 
    } 

    private static class LocalDateRangeIterator implements Iterator<LocalDate> 
    { 
     private LocalDate current; 
     private final LocalDate end; 

     private LocalDateRangeIterator(LocalDate start, 
             LocalDate end) 
     { 
      this.current = start; 
      this.end = end; 
     } 

     public boolean hasNext() 
     { 
      return current != null; 
     } 

     public LocalDate next() 
     { 
      if (current == null) 
      { 
       throw new NoSuchElementException(); 
      } 
      LocalDate ret = current; 
      current = current.plusDays(1); 
      if (current.compareTo(end) > 0) 
      { 
       current = null; 
      } 
      return ret; 
     } 

     public void remove() 
     { 
      throw new UnsupportedOperationException(); 
     } 
    } 
} 

class Test 
{ 
    public static void main(String args[]) 
    { 
     LocalDate start = new LocalDate(2009, 7, 20); 
     LocalDate end = new LocalDate(2009, 8, 3); 
     for (LocalDate date : new LocalDateRange(start, end)) 
     { 
      System.out.println(date); 
     } 
    } 
} 

To póki od Pisałem iterator w Javie, więc nadzieja to prawda. Myślę, że to dość dużo w porządku ...

Oh dla C# bloków iterator, to wszystko, co mogę powiedzieć ...

+0

Dziękuję, to właśnie uczyniło moje życie co najmniej 900% łatwiejsze. –

+0

Szukałem go, czy Joda ma coś do reprezentowania "zakresu dat" ... Najwyraźniej nie, skoro proponujesz napisanie własnej wersji LocalDateRange. – Jonik

+0

@Jonik Joda oferuje interfejs Interval i jego różne implementacje. Jednak nie byłem w stanie znaleźć implementacji "Iterable": może bardziej złożonej ... – Stephan

Powiązane problemy