2013-04-07 281 views
3

在我的紅寶石代碼中,我想顯示過去1年的所有月份名稱。例如當前日期是"April 2013",那麼我想要顯示從"May 2012""April 2013"的所有月份名稱,例如["May", "June", .., "April"]。這個最好的主意是什麼?查找去年的月份名稱

我想:

<%= (1.year.ago.to_date.strftime("%B")..Date.today.strftime("%B")).map %> { |a| a } %> 

但它給:["April"]

+0

這是因爲'1.year.ago.to_date.strftime( 「%B」)'和'Date.today.strftime( 「%B」)'都返回'「April」'。這會給你'(「April」..「April」)。map' – 2013-04-07 09:28:45

+0

「那麼我想顯示從」2012年5月「到」1013年4月「的所有月份名稱,例如[」May「,」June「,.. .. ,「五月」]「你能解決它嗎? – tokland 2013-04-07 09:46:38

回答

6

在Rails中,你可以做這樣的事情:

<% 11.downto(0) do |i| %> 
    <%= i.months.ago.strftime("%­B %Y") %> 
<% end %> 
+0

其實是一個非常好的方法。不知道爲什麼它被低估。 – mrks 2013-04-07 09:34:44

+0

請確保按照問題中的要求添加%Y。 – mrks 2013-04-07 09:35:49

+0

@mdsl,謝謝,增加了一年。 – Mischa 2013-04-07 09:36:47

3
(0..11).map do |month| 
    (11.months.ago + month.months).strftime("%B %Y") 
end 
+0

這總是從一月開始,而不是五月。 – mrks 2013-04-07 09:31:37

1

試試這個:

(0..11).each { |i| 
    month = (Date.today.month + i) % 12 + 1; 
    puts Date.new(Date.today.year - 1 + (month < Date.today.month ? 0 : 1), month).strftime("%B %Y") 
} 
5
11.downto(0).map { |m| m.months.ago.strftime("%B %Y") } 
#=> ["May 2012", "June 2012", ..., "March 2013", "April 2013"] 
3

只是出於好奇,沒有廣泛的知名漂亮shift運營商on Date

(-12..0).inject([]) { 
    |agg, v| agg << Date::MONTHNAMES[(Date.today << v).month] 
} 

,或者甚至simplier:

(-12..0).map { |v| Date::MONTHNAMES[(Date.today << v).month] } 
+1

以另一種方式使用'MONTHNAMES':'Date :: MONTHNAMES.drop(1).rotate(Date.today.month)'。 – tokland 2013-04-07 09:52:26

+0

@tokland是的,我考慮過它,但它限於12個月前,而我的解決方案可以輕鬆擴展到任何範圍。無論如何,它看起來不錯。 – mudasobwa 2013-04-07 10:28:28