我知道如何实现这一目标,但这似乎不是红宝石的做法。
我有一周的日子:
DAYS = {
1 => "Monday",
2 => "Tuesday",
3 => "Wednesday",
4 => "Thursday",
5 => "Friday",
6 => "Saturday",
7 => "Sunday"}
(可能有一些rails帮助,但我已经用我能想到的最快的方式实现了它)
现在我想创建一个数组,其中第一个元素是今天,其他日子应该保持有序。
这是这个数组
def day_keys
# proper sorting of days, start with today and then continue
day_array = (1..7).to_a
loop do
break if day_array.first == Time.now.wday
day_array.rotate!
end
day_array
end
今天是星期五,所以它返回[5,6,7,1,2,3,4]
。在此之后,我使用DAYS
哈希中的键映射此数组中的值以查找日期名称。
解决方案对我来说似乎很粗糙,所以我想听听有关如何实现这一点的一些想法。我花了一些时间看Array#cycle
和Enumerable#inject
,但似乎没有什么能满足我的需求。
答案 0 :(得分:5)
如何:((Time.now.wday)..(Time.now.wday+6)).collect{|i| ((i-1) % 7) +1}
如果你在轨道上,你还有一些助手。这会产生一个日期数组:
((Time.now.to_date)..(6.days.from_now.to_date)).collect{|i| i}
如果你想要一天的名字,那只是一个小小的修改
((Time.now.to_date)..(6.days.from_now.to_date)).collect{|i| i.strftime "%A"}
答案 1 :(得分:2)
像这样的东西会起作用......
DAYS_HASH = { 'Mon' => 1,
'Tue', => 2,
'Wed', => 3,
'Thu', => 4,
'Fri', => 5 }
DAYS_ARY = ['Mon','Tue','Wed','Thu','Fri']
def days(start)
DAYS_ARRAY.rotate(start-1)
end
天(DAYS_HASH [ '星期三'])
=> ['Wed', 'Thu', 'Fri', 'Mon', 'Tue']
答案 2 :(得分:1)
如果你有红宝石1.8.7
day_array.index(Time.now.wday).times do day_array.push(day_array.shift) end
如果你有红宝石1.9.2
day_array.index(Time.now.wday).times do day_array.rotate end
答案 3 :(得分:1)
require 'date'
today = Date.today
p (today..today+6).map{|day| Date::DAYNAMES[day.wday]}
#=>["Friday", "Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday"]