我想从一个日期移到下个月的同一天。目前我使用这个功能
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中的月份跳跃时间已缩短
- 如果没有缩短,那么新的日期就可以了
- 如果已缩短,您可以手动移动到下个月初
这里有一个使用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