我正在使用慢性来获得任何一年的最后一个星期日。它很乐意在周日给我 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中做到这一点,并且它可读且易于维护。
答案 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