2011-09-26 8 views
6

¿Es posible convertir rápidamente un valor strftime ("% u") en un strftime ("% A") o necesito crear un hash de equivalencia como {"Monday "=> 1, ......... "Sunday"=> 6}Ruby: convierta el día como decimal a día como el nombre

tengo una matriz con algunos días como valores decimales

class_index=[2,6,7] 

y me gustaría colocar a través de este matriz para construir y variedad de los días conocidos como esto

[nil, "Tuesday", nil, nil, nil, "Saturday", "Sunday"] 

por lo que podía hacer

class_list=[] 
class_index.each do |x| 
    class_list[x-1] = convert x value to day name 
end 

¿Eso es posible?

+2

Lunes 1, domingo 6? Es posible que desee volver a comprobar que ;-) – rdvdijk

+0

Oops, hehehe gracioso que –

Respuesta

6

¿Qué tal:

require "date" 
DateTime.parse("Wednesday").wday # => 3 

Oh, ahora veo que han ampliado su pregunta. ¿Qué tal:

[2,6,7].inject(Array.new(7)) { |memo,obj| memo[obj-1] = Date::DAYNAMES[obj%7]; memo } 

Me explico que uno:

input = [2,6,7] 
empty_array = Array.new(7) # => [nil, nil, nil, nil, nil, nil, nil] 
input.inject(empty_array) do |memo, obj| # loop through the input, and 
             # use the empty array as a 'memo' 
    day_name = Date::DAYNAMES[obj%7]  # get the day's name, modulo 7 (Sunday = 0) 
    memo[obj-1] = day_name     # save the day name in the empty array 
    memo         # return the memo for the next iteration 
end 

La belleza de Ruby.

+0

Aprender Ruby es un largo viaje ... :) –

+0

Wow, nunca hubiera adivinado que podría pasar un nombre como ese día. +1 –

+0

Ruby es realmente mágico :) –

4

Para ir de decimal a día de la semana:

require 'date' 
Date::DAYNAMES[1] 
# => "Monday" 

Así, en su ejemplo, usted podría simplemente hacer:

class_list=[] 
class_index.each do |x| 
    class_list[x-1] = Date::DAYNAMES[x-1] 
end 
+0

Jeje, buena persona. +1 –

1

Ésta es una forma que viene a la mente:

require "date" 

def weekday_index_to_name(index) 
    date = Date.parse("2011-09-26") # Canonical Monday. 
    (index - 1).times { date = date.succ } 
    date.strftime("%A") 
end 
0
class_index=[2,6,7] 

class_index.map{|day_num| Date::DAYNAMES[day_num%7]} 

#=> ["Tuesday", "Saturday", "Sunday"] 

tenga en cuenta que los nombres de los días son de 0 a 6, por lo puede trabajar de 0 a 6 o tener el módulo 7

Cuestiones relacionadas