2011-09-26 20 views
6

E 'possibile convertire rapidamente un valore strftime ("% u") in uno strftime ("% A") o devo creare un hash di equivalenza come {"lunedì "=> 1, ......... "Domenica"=> 6}Ruby: converti giorno come decimale in giorno come nome

ho un array con un giorno come valori decimali

class_index=[2,6,7] 

e vorrei collegare attraverso questo array per costruire e array of days name come questo

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

così ho potuto fare

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

È possibile?

+2

lunedì 1, domenica 6? Si potrebbe voler ricontrollare che ;-) – rdvdijk

+0

Oops, hehehe divertente che –

risposta

6

ne dite:

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

Oh, ora vedo che hai ampliato la tua domanda. Che ne dite:

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

Mi spiego che 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 bellezza di Ruby.

+0

Learning Ruby è un lungo viaggio .... :) –

+0

Wow, non avrei mai immaginato che potevi semplicemente passare un nome del giorno come quello. +1 –

+0

Ruby è davvero magico :) –

4

Per passare da decimale al giorno della settimana:

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

Quindi, nel tuo esempio, si può semplicemente fare:

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

Hehe, bello. +1 –

1

Ecco un modo che mi viene in 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"] 

nota che i nomi dei giorni vanno da 0 a 6, quindi puoi lavorare da 0 a 6 o farlo modulo 7

Problemi correlati