Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何计算某个日期的下一个年度发生次数?_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails 如何计算某个日期的下一个年度发生次数?

Ruby on rails 如何计算某个日期的下一个年度发生次数?,ruby-on-rails,ruby,Ruby On Rails,Ruby,给定一个Ruby日期,是否存在一个用于计算该日期下一个周年纪念日的一行程序 例如,如果日期是2011年5月1日,则下一个周年纪念日将是2012年5月1日,但是如果日期是2011年12月1日,则下一个周年纪念日将是2011年12月1日(因为该日期尚未到达)。您可以使用Ruby的date类: the_date = Date.parse('jan 1, 2011') (the_date < Date.today) ? the_date + 365 : the_date # => Sun,

给定一个Ruby日期,是否存在一个用于计算该日期下一个周年纪念日的一行程序


例如,如果日期是2011年5月1日,则下一个周年纪念日将是2012年5月1日,但是如果日期是2011年12月1日,则下一个周年纪念日将是2011年12月1日(因为该日期尚未到达)。

您可以使用Ruby的date类:

the_date = Date.parse('jan 1, 2011')
(the_date < Date.today) ? the_date + 365 : the_date # => Sun, 01 Jan 2012

the_date = Date.parse('dec 31, 2011')
(the_date < Date.today) ? the_date.next_year : the_date # => Sat, 31 Dec 2011
the_date=date.parse('2011年1月1日')
(日期<今天的日期)?#日期+365:#日期#=>太阳,2012年1月1日
_date=date.parse('2011年12月31日')
(日期<今天的日期)?下一年:2011年12月31日星期六
或者,为了方便起见,使用ActiveSupport:

需要“主动支持/核心支持/扩展/日期/计算”
_date=date.parse('2011年1月1日')
(日期<今天的日期)?下一年的日期:2012年1月1日,太阳
_date=date.parse('2011年12月31日')
(日期<今天的日期)?下一年:2011年12月31日星期六

如果
date
变量是
date
的实例,则可以使用:

返回比当前日期晚n个月的新日期对象

所以你可以这样做:

one_year_later = date >> 12
同样的方法也适用于。如果您只有一个字符串,则可以使用以下方法:

我想您最好尽可能多地使用日期库(date和DateTime),但如果您知道Rails将一直存在,或者您不介意根据需要手动拉入活动支持,则可以使用Rails扩展(例如
1.year

def next_anniversary(d)
  Date.today > d ? 1.year.from_now(d) : d
end 

有一个很好的宝石可以用来做这件事,叫做重复。您可以签出源代码或一些示例:

例如,如果设置了
日期
,则可以尝试:

date = ...
recurrence = Recurrence.new(every: :year, on: [date.month, date.day])
puts recurrence.next

仅仅为了做这件事就拉上一块宝石是过分的

your_date > Date.today ? your_date : your_date >> 12

Rails扩展了Date、DateTime和Time,因此在较低的库中处理的任何内容都将向上传播。参见@Tin Man:我指的是固定数的增加,例如
1.year
12.month
,而不是日期或日期时间的增加。闰年计算是日期的一部分
1.year
等都是Float的扩展,至少是返回的类,但是调整发生在Date中,因此它可以正常工作
Date.parse('2000年2月29日')+1.year#=>Wed,2001年2月28日
。如果它不起作用,Rails在任何涉及日期数学的事情上都会失败,我们知道事实并非如此。@Tin-Man:对。
year
等方法是对Fixnum的扩展,但它们确实返回Float,Rails实际上得到了正确的日期算法,因此我将对此提出批评。不过,我仍然认为您最好尽可能多地使用标准库。感谢您的快速教育。两张反对票-当然会有助于对原因进行一些评论?我认为这将是一个有益的回应。
date = ...
recurrence = Recurrence.new(every: :year, on: [date.month, date.day])
puts recurrence.next
your_date > Date.today ? your_date : your_date >> 12