fecha de Java fábrica iterador, con reglas que especifican cómo calcular los intervalos

StackOverflow https://stackoverflow.com/questions/847520

  •  21-08-2019
  •  | 
  •  

Pregunta

Busco una clase Java donde puedo especificar un conjunto de reglas de fechas, tales como "cada 3er domingo" y "la primera aparición de un lunes cada dos meses". Quiero ser capaz de conseguir algo así como un iterador infinita fuera de él (.Next () devolvería la próxima fecha coinciden con las reglas establecidas).

Creo que sería capaz de construir yo mismo - pero los calendarios son una molestia, y se siente como algo similar ya debe existir. No me gusta ser el que reinventar la rueda crappier.

Hay alguien consciente de algo como esto? He estado buscando en JODA, y parece que sentar las bases para ello, pero no parece dar toda la funcionalidad que quiero ..

¿Fue útil?

Solución

No creo que haya ningún iteradores fácilmente hechas de joda en tiempo o Java API Calendario para el caso, sin embargo, con joda es tan fácil que sólo debe ir con ella. Por ejemplo, después de volver a familiarizarme con joda después de unos pocos meses de pausa que hice esto en unos 10 minutos:

public class InstantIterator implements Iterator<Instant>,
                                        Iterable<Instant> {

    private Instant current;
    private final Instant original;
    private Duration skip;
    private List<Instant> skipThese;

    public InstantIterator(Instant startFrom, Duration skip) {
        this.current = original = startFrom;
        this.skip = skip;
        skipThese = new Vector<Instant>();
    }

    public boolean hasNext() {
        return true;
    }

    public Instant next() {
        Instant currentNext = current.toInstant();
        current = current.plus(skip);
        while (skipThese.contains(currentNext)) {
            currentNext = current.toInstant();
            current = current.plus(skip);
        }
        return currentNext;
    }

    public void remove() {
        skipThese.add(current.toInstant());
    }

    public Iterator<Instant> iterator() {
        return this;
    }

    public void rewind() {
        current = original.toInstant();
    }

    public void resetRemoved() {
        skipThese.clear();
    }

    public void resetIterator() {
        rewind();
        resetRemoved();
    }
}

Joda El tiempo es increíble: -)

Otros consejos

Mi empresa tiene algo muy parecido desea pero es para .NET por lo que probablemente no le hará ningún bien.

Se puede echar un vistazo a cuarzo que está diseñado para la planificación de tareas.

tl; dr

Fácil, con java.time .

Por tercera Jueves:

LocalDate.now().with(                                             // Get today's date, then adjust.
    TemporalAdjusters.dayOfWeekInMonth( 3 , DayOfWeek.THURSDAY )  // Define adjuster to move to third Thursday of same month.
)                                                                 // Instantiates another `LocalDate` object (java.time uses immutable objects).

java.time

Las clases de fecha y hora viejas problemáticas que vienen con las primeras versiones de Java son ahora obsoletos, suplantado por las clases java.time.

La clase LocalDate representa un valor de sólo fecha sin la hora del día y sin zona horaria.

LocalDate ld = LocalDate.of( 2018 , Month.FEBRUARY , 17 ) ;

Para cualquier DayOfWeek, puede ajustar en la ocurrencia ordinal de un día de la semana dentro del mismo mes (por ejemplo: tercer jueves 2 martes, etc.). Especificar el día de la semana usando TemporalAdjuster enumeración.

Para hacer el ajuste, utilice un TemporalAdjusters implementaciones se encuentran en el LocalDate::addMonths clase.

TemporalAdjuster thirdThursdayAdjuster = TemporalAdjusters.dayOfWeekInMonth​( 3 , DayOfWeek.THURSDAY ) ;  // Third-Thursday. 

Aplicar que ajustador para cualquier YearMonth, produciendo otra java.util.Date objeto.

LocalDate thirdThursday = ld.with( thirdThursdayAdjuster ) ;
  

algo así como un iterador infinita fuera de él (.Next () devolvería la próxima fecha a juego

Simplemente pasar de una a otra Calendar. Se le podría llamar SimpleDateFormat. O si se trata de un mes a la vez, utilice el Interval clase.

TemporalAdjuster thirdThursdayAdjuster = TemporalAdjusters.dayOfWeekInMonth​( 3 , DayOfWeek.THURSDAY ) ;  // Third-Thursday. 
List<LocalDate> dozenThirdThursdays = new ArrayList<>( 12 ) ;
YearMonth start = YearMonth.of( 2018 , Month.MARCH ) ;
for( int i = 1 ; i <= 12 ; i ++ ) {
    YearMonth ym = start.plusMonths( i ) ;
    LocalDate firstOfMonth = ym.atDay( 1 ) ;
    LocalDate thirdThursday = firstOfMonth.with( thirdThursdayAdjuster ) ;
    dozenThirdThursdays.add( thirdThursday ) ;
}

Acerca de java.time

El java.time marco está construido en Java 8 y versiones posteriores. Estas clases sustituyen a los viejos molestos href="https://en.wikipedia.org/wiki/Legacy_system" como YearWeek , YearQuarter , y <=> .

El href="http://www.joda.org/joda-time/" rel="nofollow noreferrer"> Joda-Time proyecto , ahora en el modo de mantenimiento , aconseja migración a la clases java.time .

Para obtener más información, consulte la Oracle Tutorial . Y la búsqueda de desbordamiento de pila durante muchos ejemplos y explicaciones. Especificación es JSR 310 .

¿Dónde obtener las clases java.time?

El ThreeTen-Extra Proyecto extiende java.time con clases adicionales. Este proyecto es un campo de pruebas para posibles futuras adiciones a java.time. Usted puede encontrar algunas clases útiles aquí, como <=> , <=> , <=> , y más .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top