2012-09-22 27 views
13

Ejemplo tengo:Rails cómo crear una serie de meses basado en un rango de fechas

range = start.to_date..(end.to_date + 1.day) 

final y el inicio son fechas.

¿Cómo creo una matriz mensual basada en este rango?

Ejemplo:

que tienen la fecha 23/1/2012 y 15/3/2012

Los meses son Januar, Februar y Marts.

quiero obtener una matriz como ["1/1/2012", "1/2/2012", "1/3/2012"]

y si el rango se betweeen 25/6/2012 al 10/10/2012

la matriz sería: ["1/6/2012", "1/7/2012", "1/8/2012", "1/9/2012", "1/10/2012"]

+0

... suponiendo un intervalo de paso de 1 mes? –

+0

Eche un vistazo aquí: http://stackoverflow.com/questions/5887756/rails-calculate-date-range-in-months –

+0

Acabo de actualizar mi pregunta con ejemplos. –

Respuesta

28
require 'date' 

date_from = Date.parse('2011-10-14') 
date_to = Date.parse('2012-04-30') 
date_range = date_from..date_to 

date_months = date_range.map {|d| Date.new(d.year, d.month, 1) }.uniq 
date_months.map {|d| d.strftime "%d/%m/%Y" } 
# => ["01/10/2011", "01/11/2011", "01/12/2011", "01/01/2012", 
#  "01/02/2012", "01/03/2012", "01/04/2012"] 
6

rieles ActiveSupport las extensiones principales incluyen un método para Date: beginning_of_month. Su función se puede escribir de la siguiente manera:

def beginning_of_month_date_list(start, finish) 
    (start.to_date..finish.to_date).map(&:beginning_of_month).uniq.map(&:to_s) 
end 

Advertencias: esto podría ser escrita de manera más eficiente, asume inicio y el final está en el orden esperado, pero por lo demás debe darle los meses que usted está buscando. También puede volver a escribir para pasar un símbolo de formato al método #to_s para obtener el formato de mes esperado.

+0

Lo he intentado sin suerte. Necesito usarlo para mi ciclo, vea más aquí: http://stackoverflow.com/questions/12544533/rails-how-to-create-chart-data-for-each-month-between-2-dates –

+0

It ayudaría a ver el resultado que está obteniendo. – rossta

+0

He actualizado la pregunta con el resultado. –

Cuestiones relacionadas