verbo todos tiempos tag resueltos questions presente present negativos negative los futuro estructura ejercicios ejemplos con afirmativos time calendar recurrence

time - todos - tag questions negative ejemplos



¿Cómo almacenaría los tiempos posibles recurrentes? (7)

Necesito almacenar si algo sucede una vez, todos los días, días de la semana, semanalmente, algunos días de la semana, algunos días del mes, que pueden ser numéricos o simbólicos, como el primer lunes de cada mes, y así sucesivamente.

¿Alguna recomendación? ¿Algún código, estructura de datos o esquema a mirar?



El problema es que hay infinitas posibilidades para especificar dicho intervalo. Por ejemplo, "El primer lunes de cada dos meses si la fecha es par, pero no 4, y el mes no es febrero de un año largo". ¿Qué tan lejos estás dispuesto a ir? Eventualmente, solo tendrá que hacer que los usuarios escriban en una expresión booleana que se evalúa como VERDADERO en los días en que se repetirá el evento. No es muy agradable desde la perspectiva de la interfaz de usuario.

Debe decidir algunas limitaciones para su sistema. Una vez que los conozca, el resto debería ser fácil, o al menos responder en SO. :)


Esto suena como un "evento recurrente" como en Outlook. Yo usaría una tabla llamada RecurrenceType para almacenar cada período de tiempo (diario, semanal, etc.). Otra tabla llamada Event woud se referirá por clave a RecurrenceType. Las fechas futuras para la mayoría de los tipos de recurrencia se pueden calcular utilizando funciones de fecha estándar.


Hay soluciones complejas y soluciones fáciles. Las dos soluciones más fáciles son:

  1. Desvíe los eventos recurrentes hasta un número constante de instancias, o hasta un rango de fechas fijo en el futuro. Almacene un F Recurrence_id con cada instancia que apunte a una descripción de la recurrencia, y permita la edición masiva y la cancelación.

    La ventaja del enfoque de despliegue de ventilador precalculado es que hace que sea muy fácil implementar excepciones de recurrencia, que seguramente será la primera solicitud de características que obtenga.

  2. Calcule en el tiempo de visualización. Las computadoras son rápidas, dependiendo de las preguntas que desee que puedan responder acerca de sus datos, a menudo será trivialmente fácil calcular todas las ocurrencias en un rango de fechas. Puede ser inteligente y tratar de delimitar rápidamente su rango de fechas antes de realizar el cálculo de recurrencia, o puede forzarlo desde la fecha de inicio.

Más allá de eso, solo necesita una solución para almacenar la regla de recurrencia que funciona con lo que sea que esté usando para calcular las recurrencias. (por ejemplo, si está utilizando una biblioteca de habilitación de iCalendar, su esquema es varchar (255) con valores RRULE)

Si tiene que sacar su propia calculadora de recurrencia, y quiere hacerlo simple, limitar sus recurrencias a diaria, semanal, mensual o anual cubre su primer caso de uso del 80% y es trivialmente fácil de calcificar.

En ese punto, su esquema de recurrencia potencial se ve algo así como:

id recurrence_start recurrence_end type (daily|weekly|monthly|yearly) day_of_week (for weekly) month day_of_month

Y, francamente, las soluciones complejas probablemente no valen la pena :)


Martin Fowler escribió un excelente trabajo sobre esto. Puede encontrar muchas de las mismas ideas que analiza en runt , una biblioteca de Ruby para tratar con expresiones temporales.



Se menciona en un hilo de SO relacionado, útil , pero una buena alternativa, mantenida activamente, a Runt si estás usando Ruby es ice_cube . No ha mencionado cuáles son sus requisitos de back-end de almacenamiento, pero para el esquema de la base de datos, @ kellan y algunos en el hilo antes mencionado son buenos comienzos.