2009-07-23 15 views
12

Estoy tratando de implementar sin éxito un iterador de fecha con hora Joda.
Necesito algo que me permita repetir todos los días de startDate a endDate
¿Tiene alguna idea de cómo hacerlo?Java Joda Time - Implementar un iterador de intervalo de fechas

+2

¿Esta ayuda en absoluto? http://stackoverflow.com/questions/847520/java-date-iterator-factory-with-rules-specifying-how-to-calculate-the-intervals – Davis

+2

Si desea días, desea ver la clase LocalDate (establecer uno como fecha de inicio) y hacer un día más para cada uno. Esto evitará los problemas de zona horaria inherentes en el instante. – Yishai

Respuesta

28

Aquí hay algo para empezar. Es posible que desee pensar en si usted quiere que sea inclusivo o exclusivo al final, etc.

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

Es un tiempo desde que he escrito un iterador en Java, por lo que la esperanza es correcto. Creo que es más o menos bien ...

Oh por bloques C# iterador, eso es todo lo que puedo decir ...

+0

Gracias, esto acaba de hacer mi vida al menos un 900% más fácil. –

+0

Estaba buscando en Google si Joda tiene algo para representar un "rango de fechas" ... Aparentemente no, ya que usted propone escribir su propio LocalDateRange. – Jonik

+0

@Jonik Joda ofrece la interfaz Interval y su variada implementación. Sin embargo, no pude encontrar una implementación 'Iterable': tal vez más compleja ... – Stephan

Cuestiones relacionadas