获取本月的最后一个星期日

ico*_*ast 7 ruby chronic

我正在使用慢性来获得任何一年的最后一个星期日.它很乐意给我第n个星期天,但不是最后一个星期天.

这有效,但不是我需要的:

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

这是我需要的,但不起作用:

Chronic.parse('last sunday in march', :now => Time.local(2015,1,1))
Run Code Online (Sandbox Code Playgroud)

有没有办法解决这个明显的限制?

更新:我正在推测下面的两个答案,因为它们都很好,但我已经在"纯Ruby"中实现了这个(在2行代码中除了require 'date'行之外),但我试图向管理层演示Ruby是用来替换正在消失的Java代码库的正确语言(并且有几十行代码来计算它),我告诉一位经理我可能会在一行Ruby中做到这一点,而且它是可读的,易于维护.

tes*_*ssi 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
Run Code Online (Sandbox Code Playgroud)

last_sunday方法可以这样使用:

last_sunday 07, 2013
#=> #<Date: 2013-07-28 ((2456502j,0s,0n),+0s,2299161j)>
Run Code Online (Sandbox Code Playgroud)

  • 而不是'while date.wday!= 0``date - = 1``end``,为什么不只是`date - = date.wday`? (3认同)
  • `(d = Date.new(2013,7,-1)) - d.wday`将是一行版本 (2认同)

ico*_*ast 3

这是有效的,并且是我所能得到的可读性:

Chronic.parse('last sunday', now: Date.new(year,3,31))
Run Code Online (Sandbox Code Playgroud)

感谢 Ismael Abreu 提出只解析“上周日”并通过:now选项控制其余部分的想法。

更新:也请支持伊斯梅尔的回答。