7

Chronic を使用して、特定の年の月の最後の日曜日を取得しています。喜んでn番目の日曜日を与えてくれるだろうが、最後の日曜日ではない.

これは機能しますが、必要なものではありません:

Chronic.parse('4th sunday in march', :now => Time.local(2015,1,1))

これは私が必要とするものですが、動作しません:

Chronic.parse('last sunday in march', :now => Time.local(2015,1,1))

この明らかな制限を回避する方法はありますか?

更新:以下の2つの回答はどちらも優れているため、支持していますが、これはすでに「純粋なRuby」(行のほかに2行のコードrequire 'date')で実装していますが、管理者に実演しようとしていますRuby は、なくなりつつある (そしてこれを計算するために数十行のコードを持っていた) Java コードベースを置き換えるために使用する適切な言語であり、私はあるマネージャーに、Ruby の 1 行でおそらくそれを行うことができると言いました。読みやすく、維持しやすいでしょう。

4

5 に答える 5

10

よくChronicわかりませんが(これまで聞いたことがない)、純粋なルビーでこれを実装できます:)

##
# returns a Date object being the last sunday of the given month/year
# month: integer between 1 and 12
def last_sunday(month,year)
  # get the last day of the month
  date = Date.new year, month, -1
  #subtract number of days we are ahead of sunday
  date -= date.wday
end

メソッドは次のlast_sundayように使用できます。

last_sunday 07, 2013
#=> #<Date: 2013-07-28 ((2456502j,0s,0n),+0s,2299161j)>
于 2013-07-31T14:53:20.560 に答える
3

これは機能し、私が得ることができるのと同じくらい読みやすいです:

Chronic.parse('last sunday', now: Date.new(year,3,31))

「先週の日曜日」だけを解析し、オプションを介して残りを制御するというアイデアについて、Ismael Abreu に感謝し:nowます。

更新: Ismael の回答にも賛成票を投じてください。

于 2013-07-31T20:37:36.243 に答える
1

少し見にくいですが、5 番目または 4 番目をこの順序で試すことができます。

d = [5,4].each do |i| 
  try = Chronic.parse("#{i}th sunday in march", :now => Time.local(2015,1,1))
  break try unless try.nil?
end
 => Sun Mar 29 12:30:00 +0100 2015

d = [5,4].each do |i| 
  try = Chronic.parse("#{i}th sunday in april", :now => Time.local(2015,1,1))
  break try unless try.nil?
end
 => Sun Apr 26 12:00:00 +0100 2015
于 2013-07-31T14:58:02.763 に答える