将日期提前一个月到较短的月份时,如何才能提前到下个月的第一个月



我想从一个日期移到下个月的同一天。目前我使用这个功能

Time.now.utc + 1.month

它在大多数日子都能正常工作,但在下个月较短的月末,我想改为下个月的第一天。例如:

Thursday, July 31 = $25.99 USD
Saturday, August 31 = $25.99 USD
Wednesday, October 1= $25.99 USD # instead of September 30
Saturday, November 1= $25.99 USD

等等

[67] pry(main)> now = Time.parse('2021-01-30 20:17:40')
=> 2021-01-30 20:17:40 +0700
[68] pry(main)> now.next_month
=> 2021-02-28 20:17:40 +0700

我希望它返回2021-03-01

请帮帮我!

是的,通常使用Ruby内置的日期函数,提前一个月会缩短它跳过的时间,使新日期保持在原始日期之后的月份。

你能做的是采取多步骤的方法:

  1. 选择原来的日期,提前一个月获得新的日期
  2. 查看每个日期的日期组成部分。如果新日期的日期小于原始日期,则步骤1中的月份跳跃时间已缩短
  3. 如果没有缩短,那么新的日期就可以了
  4. 如果已缩短,您可以手动移动到下个月初

这里有一个使用Rails的时间助手的快速而肮脏的方法,希望能让它变得更清晰:

def advance_by_one_month(date)
next_date = date.next_month
if next_date.day < date.day
next_date.next_month.beginning_of_month
else
next_date
end
end

和实际行动:

%> d = Date.new(2021, 8, 31)
# => Tue, 31 Aug 2021
%> advance_by_one_month(d)
# => Fri, 01 Oct 2021

最新更新