2012-02-12 1 views
4

私は数十年前の過去数年間のすべての日と月をループし、各日付の月と日の名前を持つ必要があります。明らかにこれを達成できる一連のループがありますが、これを達成するための最も簡潔なルビー風の方法を知りたかったのです。過去X年にわたり数値的に+月と日をループする方法は?

基本的に私は、過去のX年間で日ごとに、このような出力を必要とするだろう:

2011年1月3日と2011年1月3日

クリーンなアプローチは何ですか?

答えて

18

日付は範囲として機能することができるため、範囲を繰り返し処理するのはかなり簡単です。実際には、メソッド(here)に書かれているフォーマットされた文字列として出力するしか方法はありません。

from_date = Date.new(2011, 1, 1) 
to_date = Date.new(2011, 1, 10) 

(from_date..to_date).each { |d| puts d.strftime("%-d %B %Y and %-m/%-d/%Y") } 

# => 1 January 2011 and 1/1/2011 
# => 2 January 2011 and 1/2/2011 
# => ... 
# => 9 January 2011 and 1/9/2011 
# => 10 January 2011 and 1/10/2011 

注:私は方法再度Windowsで%-dようパディングされていないパーセント形式でいくつかの不運を持っ思い出すが、上記の仕事としていない場合、あなたは彼らがパディングされていないという環境の中で、あなたが削除することができますしたいですダッシュし、あなた自身の回避策を採用してください。)

+2

'from_date.step(to_date)'は別の方法です。 – steenslag

2

minとmaxがDateオブジェクトであるRangeを構築できるかどうかを確認し、その範囲で.eachを呼び出します。 Dateオブジェクトがsuccメソッドをサポートしている場合、これはうまくいくはずです。

4

考えるstart_date & end_date:言っ

(start_date..end_date).each do |date| 
    # do things with date 
end 

Davidとして、これが原因Date#succ可能です。 Date#strftimeを使用すると、希望の形式で日付を取得できます。

関連する問題