2009-01-30 19 views
6

Estoy usando la implementación de RFC2445 de Google (http://code.google.com/p/google-rfc-2445/) para reglas de recurrencia. Si defino una recurrencia MENSUAL a partir del 30 de enero, los meses con menos de 30 días (es decir, febrero) serán salteados por completo. Entonces, la API de Google regresaría el 30 de enero, el 30 de marzo, el 30 de abril, etc. No es bueno. Esperaría que volviera: 30 de enero, 28 de febrero, 30 de marzo, 30 de abril.Definición de regla de recurrencia (RFC2445) pregunta

Del mismo modo, si seleccioné una fecha de inicio del 31 de enero, se omitirán los meses con menos de 31 días.

Esto puede ser correcto según la especificación RFC2445 o puede ser un error. ¿Qué piensas?

Mi pregunta principal es, ¿hay alguna manera de definir una regla que diga "recurrir el 30 de cada mes, o el último día del mes si el 30 no existe". Yo no creo que exista. ¿Alguna sugerencia?

Gracias de antemano.

Saludos, Cormac

Respuesta

17

La respuesta es: FREC = MENSUAL; BYMONTHDAY = 28,29,30; BYSETPOS = -1 lo que se traduce en "repetirá el día 30 de cada mes, o el último día del mes si el 30 de doesn' t existe ".

+0

¿Puedes explicar por qué BYMONTHDAY = 28,29,30 se traduce a 30th of mes, y no a 28th y 29th y 30th? –

+6

Se debe a la sintaxis de BYSETPOS. Una traducción más precisa sería "recurrir en la última (-1) POSICIÓN del SET 28, 29, 30 que existe para el mes dado". Entonces, si el 30 no existe, el último elemento válido en el conjunto es 29. Si eso no existe, es 28. ¡Buen hallazgo, @Cormac Redmond! –

+0

¿Podría alguien ser tan amable de indicarme alguna documentación para la Regla de recurrencia? Parece que no puedo encontrar ninguno. –

0

Bueno, mirando a RFC 2445 sí que sin duda parece que el comportamiento que se está viendo es correcta:

Si se encuentran valores de las partes de la regla BYxxx los cuales están fuera del alcance disponibles (es decir, BYMONTHDAY = 30 en febrero), simplemente se ignoran.

La única solución que puedo pensar es utilizar varias reglas de recurrencia, es decir, una para el 30 de cada mes y otra para el último día de febrero.

0

Parece que tiene razón sobre el RFC omitiendo esas fechas. Si su DTSTART el 31 de enero, y no se especifica un BYMONTHDAY en su regla de repetición (o si BYMONTHDAY es el día 31), entonces simplemente a ignorar esa regla en los meses en que no hay tal día:

Si se encuentran valores de parte de la regla BYxxx que están más allá del alcance (es decir, BYMONTHDAY = 30 en febrero), simplemente se ignoran .

Sin embargo, usted debería ser capaz de especificar -1 para BYMONTHDAY y tienen que utilizar el último día del mes, lo que puede pasar a ser.

La parte BYMONTHDAY regla especifica un carácter coma (ASCII decimal 44) lista separada de los días del mes. Los valores válidos son de 1 a 31 o de -31 a -1. Por ejemplo, -10 representa la décima hasta el último día del mes.

+0

Los números negativos casi funcionan; el que pregunta quiere -2 en meses con 31 días, -1 en meses con 30 (o 29 o 28) días. Mucho más cerca ... –

+0

Esto es cierto, no pensé que fuera posible, pero encontró el BYSETPOS por su cuenta, que hace exactamente lo que quiere. –

Cuestiones relacionadas