2009-07-23 8 views
12

Sto tentando di implementare senza successo un iteratore di date con l'ora di Joda.
Ho bisogno di qualcosa che mi permetta di ripetere tutti i giorni modulo startDate a endDate
Avete qualche idea su come farlo?Java Joda Time - Implementare un iteratore dell'intervallo di date

+2

Questo aiuto a tutti? http://stackoverflow.com/questions/847520/java-date-iterator-factory-with-rules-specifying-how-to-calculate-the-intervals – Davis

+2

Se si desidera giorni, si desidera esaminare la classe LocalDate (impostane uno come data di inizio) e fai più giorni per ogni successivo. Ciò eviterà i problemi legati al fuso orario insiti nell'istante. – Yishai

risposta

28

Ecco qualcosa per iniziare. Si consiglia di pensare se si desidera che sia inclusiva o esclusiva, alla fine, ecc

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

E 'un po' che ho scritto un iteratore in Java, quindi mi speranza è giusto. Penso che sia più o meno a posto ...

Oh per C# blocchi iteratore, questo è tutto quello che posso dire ...

+0

Grazie, questo mi ha reso la vita almeno il 900% più facile. –

+0

Stavo cercando su google se Joda ha qualcosa da rappresentare per un "intervallo di date" ... Apparentemente no, dal momento che si propone di scrivere il proprio LocalDateRange. – Jonik

+0

@Jonik Joda offre l'interfaccia Interval e le sue varie implementazioni. Tuttavia non sono stato in grado di trovare un'implementazione 'Iterable': forse più complessa ... – Stephan

Problemi correlati