2014-04-25 43 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具有相同的实现。