Forum: Rails-ES meses entre dos fechas

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
80b9be0b3d9c2d5fa3372dff8d457a8e?d=identicon&s=25 Aprendiz_ror Ruby on rails (aprendiz_ror)
on 2009-04-26 02:21
Buenas.

existe algun helper o funcion que me imprima o devuelva en un hash o en
cualquier otra estructura, los nombres de los meses comprendidos entre
dos fechas?

ej: 2009-01-01 y 2009-05-01

me deberia devolver "Enero", "Febrero", "Marzo", "Abril", "Mayo"

Mientras estoy haciendo esto:

en el modelo

  def meses_pago
    ms = ["Enero", "Febrero", "Marzo", ......"Diciembre"]
    mi = fecini.mon
    mf = fecfin.mon
    for i in mi..mf
       meses = []
       # aca voy
    end
    return meses
  end

mil gracias por la ayuda.
0e34c56054c414263e933a1b8b3d0d55?d=identicon&s=25 Ruben Davila (rdavila)
on 2009-04-26 05:37
(Received via mailing list)
Tal vez esto te pueda ser util:

def get_months_in_dates(d1, d2)
  return [I18n.l(d1, :format => '%B')] if d1.strftime('%m-%Y')==
d2.strftime('%m-%y')

  recent_date, paste_date = d1 < d2 ? [d2, d1] : [d1, d2]

  c=0
  months = []

  loop do
    past_date = past_date.months_since(c)
    months << I18n.l(past_date, :format => '%B')
    break if past_date.strftime('%m-%Y') ==
recent_date.strftime('%m-%Y')
    c += 1
  end
  months
end

Primero compruebo si las 2 fechas se encuentran en el mismo mes, si es
asi
entonces retorno rapido el nombre del mes, en caso contrario se sigue
procesando el metodo obteniendo la fecha reciente y la antigua, luego
entra
en un loop que acabara cuando el año y mes de ambas fechas sean el
mismo.

Saludos.
80b9be0b3d9c2d5fa3372dff8d457a8e?d=identicon&s=25 Aprendiz_ror Ruby on rails (aprendiz_ror)
on 2009-04-26 12:57
Gracias Ruben

lo voy a incorporar a mi aplicacion pues la funcion que hic me quedo con
mucho codigo.

gracias y saludos
80b9be0b3d9c2d5fa3372dff8d457a8e?d=identicon&s=25 Aprendiz_ror Ruby on rails (aprendiz_ror)
on 2009-04-26 13:26
Ruben, creo que me toca montar algo mas referente a internacionaizacion.

gracias
1f2eadfb41362800ebc2cf211b91d0f7?d=identicon&s=25 javier ramirez (Guest)
on 2009-04-26 14:00
(Received via mailing list)
una posible alternativa (sin internacionalización.. si la quieres añadir
es cambiar el array por una llamada a i18n)

def months_in_range(d1,d2)
  return nil unless d1 <= d2
  year_lap=d2.year - d1.year
  m1,m2=d1.month,d2.month

  range=if year_lap == 0
    (m1..m2).to_a
  else
    (m1..12).to_a + (1..12).to_a * year_lap + (1..m2).to_a
  end

m_names='jan','feb','mar','apr','may','jun','jul','aug','sept','oct','nov','dec'
  range.map{|m| m_names[m-1]}
end

Si los meses están en el mismo año, con un simple rango nos vale para
saber los números de mes que hay en medio. Si están en diferente
año,tendrás varios rangos de 1..12 y luego dos rangos extras, desde el mes
inicial hasta el final de ese año, y desde el principio del último
añoal mes final.

Cuando ya sepas el rango completo de números de mes que hay en el
intervalo, sólo queda mapear ese array de índices de mes a sus nombres
con el método que prefieras (en el ejemplo un array sencillo y un map
con el índice)

saludos,

j

--
javier ramírez

..i do ruby on rails development in madrid, spain, at
http://www.aspgems.com
..you can find out more about me on http://formatinternet.wordpress.com
and http://workingwithrails.com/person/5987-javier-ramirez
39086eb3d9a1437276d07c08ea0c3821?d=identicon&s=25 Guillermo (Guest)
on 2009-04-26 14:32
(Received via mailing list)
2009/4/26 Aprendiz_ror Ruby on rails <ruby-forum-incoming@andreas-s.net>

> Buenas.
>
> existe algun helper o funcion que me imprima o devuelva en un hash o en
> cualquier otra estructura, los nombres de los meses comprendidos entre
> dos fechas?
>

Que yo sepa no. Pero tienes DateTime ranges

def month_names_between(d1,d2)
  (d1...d2).map{|d| I18n.l(d, :format=>'%B')}.uniq
end

>> month_names_between( Date.current-3.months, Date.current )
=> ["January", "February", "March", "April"]


No es del todo correcto, ya que interas todos los días, pero el código
queda
más sencillito.

--
Guillermo Álvarez

Sent from Madrid, Comunidad de Madrid
80b9be0b3d9c2d5fa3372dff8d457a8e?d=identicon&s=25 Aprendiz_ror Ruby on rails (aprendiz_ror)
on 2009-04-26 21:34
Gracias por todos sus aportes, la solucion la logre con el post de Ruben
y complemente con este otro post:
http://www.ruby-forum.com/topic/173897#new

gracias a la comunidad de esta lista he logrado avanzar mucho.
80b9be0b3d9c2d5fa3372dff8d457a8e?d=identicon&s=25 Aprendiz_ror Ruby on rails (aprendiz_ror)
on 2009-04-26 21:37
pero hace falta algo en este caso:

2008-08-01   y 2009-02-01

estoy tratando de solucionarlo.

saludos
80b9be0b3d9c2d5fa3372dff8d457a8e?d=identicon&s=25 Aprendiz_ror Ruby on rails (aprendiz_ror)
on 2009-04-27 04:33
por fin termine el codigo, me parece HORRIBLE pero hace lo que necesito.

se que con la ayuda de todos ustedes lo puedo mejorar.

saludos
39086eb3d9a1437276d07c08ea0c3821?d=identicon&s=25 Guillermo (Guest)
on 2009-04-27 09:53
(Received via mailing list)
2009/4/27 Aprendiz_ror Ruby on rails <ruby-forum-incoming@andreas-s.net>

> por fin termine el codigo, me parece HORRIBLE pero hace lo que necesito.

se que con la ayuda de todos ustedes lo puedo mejorar.


 Si no pones el código... lo dudo mucho.

--
Guillermo Álvarez

Sent from Madrid, Comunidad de Madrid
80b9be0b3d9c2d5fa3372dff8d457a8e?d=identicon&s=25 Aprendiz_ror Ruby on rails (aprendiz_ror)
on 2009-04-27 21:06
jejejej.  Tienes Razon Guillermo, quede tan loco que no me fije que lo
puse.

advierto, quedo horrible pero hace lo que quiero.

saludos


  def month_names_between
    return [I18n.l(fecini, :format => '%B')] if
fecini.strftime('%m-%Y')== fecfin.strftime('%m-%Y')
    ai = fecini.strftime('%Y').to_i
    af = fecfin.strftime('%Y').to_i
    mi = fecini.strftime('%m').to_i
    mf = fecfin.strftime('%m').to_i
    mes = []
    for i in (ai..af)
       if ai == af
           for m in mi..mf
              f = (i.to_s+'-'+l.to_s+'-01').to_time
              mes << I18n.l(f, :format => '%B')+'-'+i.to_s
           end
       elsif (i < af)
           for l in (mi..12)
              f = (i.to_s+'-'+l.to_s+'-01').to_time
              mes << I18n.l(f, :format => '%B')+'-'+i.to_s
           end
       else
           for k in 1..mf
              f = (i.to_s+'-'+k.to_s+'-01').to_time
              mes << I18n.l(f, :format => '%B')+'-'+i.to_s
           end
       end
    end
    mes
  end
9f13f0ff5f5f41f5598ad755f192ca3a?d=identicon&s=25 Luis felipe Hurtado campuzano (luisfelipehurtado)
on 2009-04-27 21:50
(Received via mailing list)
Que algo como esto...

f1 = Time.now
f2 = 15.months.since

f_start = f1.beginning_of_month
f_end = f2.beginning_of_month

f_iterator = f_start
months = []

begin
  months << f_iterator.month
  f_iterator = f_iterator.months_since(1)
end while f_iterator < f_end



f1 y f2 serían las dos fechas y se está asumiendo que f1 < f2. Le falta
meterle algunas cosas pero creo que a nivel de algoritmo sería mas
sencillo
e incluso mas eficiente.

Saludos,


2009/4/27 Aprendiz_ror Ruby on rails <ruby-forum-incoming@andreas-s.net>
49b6123803e4f327144e991daab62f77?d=identicon&s=25 Daniel Rodriguez Troitiño (Guest)
on 2009-04-27 23:06
(Received via mailing list)
On Mon, Apr 27, 2009 at 21:06, Aprendiz_ror Ruby on rails
<ruby-forum-incoming@andreas-s.net> wrote:
> jejejej.  Tienes Razon Guillermo, quede tan loco que no me fije que lo
> puse.
>
> advierto, quedo horrible pero hace lo que quiero.
>

El correo electrónico no es el mejor sitio para comentar código. Me he
decidido por un Gist en Github <http://gist.github.com/102704>. Allí
están tu versión y mi versión (no me he desviado de tu idea, pero he
realizado muchos pequeños cambios), y creo que si alguién quiere
aportar su versión no tiene más que forkear.
80b9be0b3d9c2d5fa3372dff8d457a8e?d=identicon&s=25 Aprendiz_ror Ruby on rails (aprendiz_ror)
on 2009-04-28 01:30
Gracias Luis F.

pero no me arroja los resultados esperados.

  def felipe
    f1 = fecini
    f2 = fecfin
    f_start = f1.beginning_of_month
    f_end = f2.beginning_of_month
    f_iterator = f_start
    months = []
    begin
      months << f_iterator.month
      f_iterator = f_iterator.months_since(1)
    end while f_iterator < f_end
    months
  end

saludos
80b9be0b3d9c2d5fa3372dff8d457a8e?d=identicon&s=25 Aprendiz_ror Ruby on rails (aprendiz_ror)
on 2009-04-28 02:04
Gracias Daniel, me sale el error:
can't convert Array into Integer

saludos
80b9be0b3d9c2d5fa3372dff8d457a8e?d=identicon&s=25 Aprendiz_ror Ruby on rails (aprendiz_ror)
on 2009-04-28 02:11
Daniel aca esta el error, pero no estoy en capacidad de resolverlo:

tenes:
mes.map { |mes, anio| "#{I18n.t("date.month_names")[mes]}-#{anio}" }

y debe ser:
meses.map { |mes, anio| "#{I18n.t("date.month_names")[mes]}-#{anio}" }

sin embargo sigue el error que te menciono.

saludos y gracias
49b6123803e4f327144e991daab62f77?d=identicon&s=25 Daniel Rodriguez Troitiño (Guest)
on 2009-04-28 08:07
(Received via mailing list)
2009/4/28 Aprendiz_ror Ruby on rails
<ruby-forum-incoming@andreas-s.net>:
> saludos y gracias
Tienes razón, ese es un error. Se me pasó, iba probando las cosas una
a una, pero no todo en general.
Y por eso se me pasó también que debería haber utilizado "+=" en vez
de "<<" para añadir nuevos elementos al array de meses.
Ahora, probandolo del todo, a mí me funciona el código. Te queda tu
parte de hacer las pruebas de unidad.
Todo sigue estando en <http://gist.github.com/102704>.

Suerte.
80b9be0b3d9c2d5fa3372dff8d457a8e?d=identicon&s=25 Aprendiz_ror Ruby on rails (aprendiz_ror)
on 2009-05-01 23:28
Excelente Daniel, eso era lo quenecesitaba, ya me funciona maravilloso.

gracias
This topic is locked and can not be replied to.