我正试图从Date中减去月份,因为它没有给出准确的结果
end_date = Date.parse("30-09-2019")
end_date - 1.months
返回2019年8月30日
example 30-09-2019 - 1.month to give 31 - 08 - 2019
example 15-09-2019 - 1.month to give 14 - 08 - 2019
Date.new(2019, 9, 30) - 1.month
导致Fri, 30 Aug 2019
的原因很简单,因为1.month
不是30天,而是2629746秒(30.436875天(的静态值。
date = Date.new(2019, 9, 30)
1.month == 30.436875.days #=> true
date - 30.days #=> Sat, 31 Aug 2019
date - 30.436875.days #=> Fri, 30 Aug 2019
您可以在这里找到这些静态值。
在Ruby中有几种方法可以用来从日期中减去月份,下面的指南非常全面地介绍了您可以在Ruby中执行的所有日期操作方法:
Ruby Cookbook,第2版,作者:LeonardRichardson,Lucas Carlson
1.使用<lt;(方法(
require 'date'
end_date = Date.parse("30-09-2019")
end_date = end_date << 1
print(end_date.strftime("%d-%m-%Y"))
2.使用prev_month((
require 'date'
end_date = Date.parse("30-09-2019")
end_date = end_date.prev_month //this would give the desired result
print(end_date.strftime("%d-%m-%Y"))
您可以从ActiveSupport使用DateTime#advance
。
使用日期为年、月和天。options参数采用以下任意键的散列::年、:月、:周、:天、:小时、:分钟、:秒。
irb(main):001:0> end_date = Date.parse("30-09-2019")
=> Mon, 30 Sep 2019
irb(main):002:0> end_date.advance(months: 1)
=> Wed, 30 Oct 2019
irb(main):003:0> end_date.advance(months: -1)
=> Fri, 30 Aug 2019
irb(main):004:0> end_date.advance(months: -1, days: 2)
=> Sun, 01 Sep 2019
是的,使用.advance
回溯在语义上很奇怪,但它对负值很有效。不幸的是,没有相反的方法。