在ruby中,从日期减去月份并不能给出正确的值



我正试图从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回溯在语义上很奇怪,但它对负值很有效。不幸的是,没有相反的方法。

相关内容

最新更新