2011-11-07 13 views
5

Soy nuevo en ruby, y tengo un problema con algunas funciones de fecha. Intento agregar un mes calendario a la fecha provista, de modo que "30 de abril de 2002" arroje "31 de mayo de 2002". Aquí está mi códigoRuby agregar un mes calendario

date = '30th Apr 2002' 
parseDate = Date.parse(date) 

(parseDate >> 1) # This returns 2002-05-30 

Tal vez no es así como se supone que la función de trabajar, en cuyo caso yo tendría que escribir un código para devolver el último día del mes siguiente, si la fecha suministrada es la última ¿día del mes?

Cualquier ayuda sería apreciada gracias.

+0

Entonces, ¿a qué tendría que añadir un mes para poder obtener el 30 de mayo de 2002? Si me pidieran la fecha un mes calendario después del 30 de abril, diría que 30 de mayo ... –

+0

Sí, esta es la lógica que esperaría, sin embargo, mis requisitos establecen que un recordatorio por correo electrónico debe enviarse un mes calendario antes del fecha de vencimiento. Si la fecha de vencimiento es 31 de mayo, se debe enviar un recordatorio por correo electrónico el 30 de abril – namtax

+0

. Así que eso no es * agregar * un mes calendario, eso es * restar * un mes calendario, que es muy diferente. –

Respuesta

0

con ActiveSupport

parseDate = parseDate + 1.month.since(parseDate) 

o 30 días exactamente, por lo que puede deslizarse un poco

parseDate = parseDate + (30*24*60*60) 
+0

Hola, creo que mi pregunta no fue 100% clara. Jon Skeet me ha ayudado, gracias de todos modos por tu ayuda. Gracias – namtax

4

El >> se limita a incrementar el mes y mantener el mismo día dentro del mes, que como Skeet señaló en un comentario que es algo sensato ...

Pero para obtener el comportamiento que desea, puede simplemente sumar y restar un día en el orden correcto para tomar el último día en el límite mes y vuelta:

((parseDate +1) >> 1) - 1 

Para restar meses, como se desprende de los comentarios que realmente desea, utilizar el mismo truco pero el operador inverso mes.

((parseDate +1) << 1) - 1 
+0

¿Funcionará esto solo en el caso extremo que proporcioné? O con todos los meses? Gracias – namtax

+0

Sí en el estuche que proporcionó, como lo verifiqué en irb. No veo ninguna razón por la que no funcione en general. –

+0

no funcionará para febrero, ya que el 28º o 29º + 1 no lo transferirán al mes siguiente - el resto de los meses debería funcionar bien. –

Cuestiones relacionadas