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

时间:2013-07-31 14:31:15

标签: ruby 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))

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

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

5 个答案:

答案 0 :(得分: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)>

答案 1 :(得分:4)

在你的问题中阅读更新,我试图仅使用一行ruby代码(不使用gems)来提出另一个答案。这个怎么样?

##
# 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, go back until we have a sunday
  Date.new(year, month, -1).downto(0).find(&:sunday?)
end

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

答案 2 :(得分:3)

怎么样?
Chronic.parse('last sunday', now: Chronic.parse('last day of march'))

答案 3 :(得分:3)

这是有效的,并且尽可能可读:

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

感谢Ismael Abreu提出的解析“最后一个星期天”并通过:now选项控制其余部分的想法。

更新:请同时提出伊斯梅尔的回答。

答案 4 :(得分:1)

这有点难看,但你可以按顺序尝试第五或第四:

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