2013-03-04 19 views
7

私はRubyを初めて使っており、毎月最終金曜日の日を取得したいと考えています。 たとえば、3月の最後の金曜日は29日、4月26日の最後の金曜日です。 どうすれば解決策を得ることができますか? 私はレールフレームワークを使用しています。毎月最後の金曜日の日を取得します

メソッド.cweekは、今週の週を返しますが、現在の月の週は返しません。

+1

@sawa私は彼の例が今年を参照していると思います... – aromero

答えて

8
#!/usr/bin/env ruby 

require 'date' 

(1..12).each do |month| 
    d = Date.new(2013, month, -1) 
    d -= (d.wday - 5) % 7 
    puts d 
end 

Source(第2 /第三Googleの結果...)

+2

'd = Date.ne w(2013、月、-1) 'は、月の最終日も与えます。 – steenslag

+0

@steenslagはい、私はそれをもっと好む。コードを更新しました –

1
require "active_support/core_ext" 

end_of_month = Date.today.end_of_month 
if end_of_month - end_of_month.beginning_of_week >= 4 
    end_of_month+5.days 
else 
    end_of_month-2.days 
end 
# => Fri, 29 Mar 2013 
+0

あなたのスクリプトにThu、Apr 4月2013 Rubyコンソール – Leoh

+0

を残して申し訳ありません、私は平日のカウントを1から持ちました。 – sawa

4

私は李氏の答えとなるだろう、それはかなりクールだ(私は思った)ので、私はこれだけを投稿しています。月の最終金曜日を取得

#Last Friday of this coming December 
require 'chronic' 
last_friday = Chronic.parse("First Friday of next January") - 1.week 
+0

かなりクールな宝石! – Leoh

+2

あなたは私もChronic(私はそれを維持している)を提案する最初のだろうと思うだろう、それは間違いなくその場所を持っています。私はそれがここにあるとは思っていませんが、確かにオプションのないものです。 –

2

は1行で行うことができます:

def last_fridays_for_every_month_of_year(year) 
    (1..12).map do |month| 
    Date.new(year, month, -1).downto(0).find(&:friday?) 
    end 
end 

あなたはこのようにそれを使用することがあります。

宝石 Chronichttps://github.com/mojombo/chronic)を使用して

last_fridays_for_every_month_of_year 2013 
#=> [#<Date: 2013-01-25 ((2456318j,0s,0n),+0s,2299161j)>, 
    #<Date: 2013-02-22 ((2456346j,0s,0n),+0s,2299161j)>, 
    #<Date: 2013-03-29 ((2456381j,0s,0n),+0s,2299161j)>, 
    #<Date: 2013-04-26 ((2456409j,0s,0n),+0s,2299161j)>, 
    #<Date: 2013-05-31 ((2456444j,0s,0n),+0s,2299161j)>, 
    #<Date: 2013-06-28 ((2456472j,0s,0n),+0s,2299161j)>, 
    #<Date: 2013-07-26 ((2456500j,0s,0n),+0s,2299161j)>, 
    #<Date: 2013-08-30 ((2456535j,0s,0n),+0s,2299161j)>, 
    #<Date: 2013-09-27 ((2456563j,0s,0n),+0s,2299161j)>, 
    #<Date: 2013-10-25 ((2456591j,0s,0n),+0s,2299161j)>, 
    #<Date: 2013-11-29 ((2456626j,0s,0n),+0s,2299161j)>, 
    #<Date: 2013-12-27 ((2456654j,0s,0n),+0s,2299161j)>] 
+0

こんにちは@tessi、 '.find(&friday?)'フラグメントが何をしているのか説明してもらえますか?私はそれに関する関連文書を見つけることができないようです。 – vincentleest

+0

@vincentleest。 'Date.new(年、月、-1).downto(0)'はあなたに日付の配列を与えます。 find-partは 'date_array.find {| d | d.friday?} '。 'date.friday?'が 'true'を返す最初の日付を返します。 – tessi

関連する問題