2014-04-25 75 views
0

我試圖使用DateTime來查看日期列表,並查找最常與列表中的每個日期關聯的星期幾(星期一,星期二,星期三,& c。)。使用DateTime從日期打印日期名稱?

我想這一點:

contents = CSV.open 'event_attendees.csv', headers: true, header_converters: :symbol 

contents.each do |row| 
times = contents.map { |row| row[:regdate] } 
target_days = Hash[times.group_by { |t| DateTime.strptime(t, '%m/%d/%Y %H:%M').wday }.map{|k,v| [k, v.count]}.sort_by{ |k,v| v }.reverse] 
puts target_days 

我得到:

{1=>6, 2=>5, 5=>4, 6=>2, 0=>1} 

從我瞭解wday每天將表示爲0(星期日),1(星期一),&Ç什麼。我難以理解如何將其轉換爲當天的實際名稱?或者,如何將其轉換爲縮寫名稱(Sun,Mon,Tue,& c。)?

此外,我不積極,上述返回正確的日子。看看我的名單,11/12/2008有六個日期。 2008年11月12日是一個星期三 - 但它看起來像是顯示最常見的一天,計數爲6,是星期一。所以,我不確定這是否真的在計算一週中的正確日期。

有人可以請解釋爲什麼我所做的似乎並沒有計算一週的正確日期,也 - 如何將其轉換爲一天的名稱和縮寫名稱?

謝謝!

回答

1

可以使用Date::ABBR_DAYNAMES轉換wday整數使用Date::DAYNAMES全名及縮寫名稱:

Date::DAYNAMES[3] 
#=> "Wednesday" 

Date::ABBR_DAYNAMES[3] 
#=> "Wed" 

更新

至於你的算法去,看起來我的權利:

require "date" 

times = [ 
    "4/25/2014 00:00", # Friday 
    "4/21/2014 00:00", # Monday 
    "4/22/2014 00:00", # Tuesday 
    "4/20/2014 00:00", # Sunday 
    "4/22/2014 00:00", # Tuesday 
    "4/21/2014 00:00", # Monday 
    "4/21/2014 00:00", # Monday 
    "4/19/2014 00:00"] # Saturday 

target_days = Hash[times.group_by do |time| 
     DateTime.strptime(time, "%m/%d/%Y %H:%M").wday 
    end.map do |key, value| 
     [Date::ABBR_DAYNAMES[key], value.count] 
    end.sort_by do |key, value| 
     value 
    end.reverse] 

puts target_days 
#=> {"Mon"=>3, "Tue"=>2, "Sat"=>1, "Sun"=>1, "Fri"=>1} 

我會仔細檢查f的內容ile,然後逐步完成算法,看看發生了什麼問題。

+0

這正是我想弄明白的。謝謝!我想出了爲什麼它會出現錯誤的一週 - 我意外地有%Y,它應該是%y。 – Robbie

0
time = Time.new(2000) 

# The full weekday name 
puts time.strftime("%A") 
# Saturday 

# The abbreviated name 
puts time.strftime("%a") 
# Sat 

有關更多詳細信息,請參見Time.strftimeDateTime具有相同的實現。