Вычитание месяца из даты не дает правильного значения в рубине? - PullRequest
0 голосов
/ 07 ноября 2019

Я пытаюсь вычесть месяц из даты, когда он не дает точного результата

end_date = Date.parse("30-09-2019")
end_date - 1.months

возвращает 30 августа - 2019

example 30-09-2019 - 1.month to give 31 - 08 - 2019
example 15-09-2019 - 1.month to give 14 - 08 - 2019

Ответы [ 3 ]

2 голосов
/ 07 ноября 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

Вы можете найти этизадокументированы статические значения здесь .

0 голосов
/ 07 ноября 2019

Вы можете использовать DateTime#advance от ActiveSupport.

Использование даты для точного расчета времени по годам, месяцам и дням. Параметр 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 возвращаться назад семантически странно, но отлично работает с отрицательными значениями. К сожалению, обратного метода не существует.

0 голосов
/ 07 ноября 2019

Есть несколько подходов, которые вы можете использовать для вычитания месяцев из даты в Ruby, следующее руководство довольно полно описывает все методы манипулирования датами, которые вы можете выполнять в Ruby:

Ruby Cookbook,2-е издание Леонард Ричардсон, Лукас Карлсон

1. Используя << (метод) </strong>

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"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...