Ruby - рассчитать разницу в днях

Я пытаюсь рассчитать разницу в днях (как целое число) между двумя датами. Как мне справиться с разницей, если это отрицательное целое число?

Вот пример моего кода.

expiry_date заполняется из ответа JSON

expiry_date #e.g - 2019-04-01

def calculate_date_difference
 (expiry_date - Date.today).to_i
end

if calculate_date_difference.between?(0,90)
 puts "90 days or less"
elsif calculate_date_difference > 90
 puts "more than 90 days"
else 
 puts "past"
end

Код работает правильно, когда expiry_date находится в будущем, однако, если дата истечения срока действия находится в прошлом, он продолжает попадать в неправильное состояние. Например, разница в этом примере равна «-9».

Я ожидаю, что он напечатает «прошлое», но всегда печатает «90 дней меньше».

Спасибо

У меня работает, а как вы создаете свой expiry_date?

Eyeslandic 10.04.2019 18:14

Можете ли вы показать свое точное определение expiry_date? Если это строка, вам нужно Date.parse в Date. Также стоит отметить, что вы вызываете этот метод более одного раза, а это означает, что вам нужно выполнять вычисления несколько раз. Вместо этого сделайте расчет один раз, сохраните его в переменной, а затем сравните.

tadman 10.04.2019 18:34

Вот где была моя проблема - я не использовал Date.parse в строке. Теперь работает как положено, спасибо

Phil C 10.04.2019 18:48
"2019-04-20" - Date.today #=> NoMethodError (undefined method '-' for "2019-04-20":String), поэтому я не понимаю, как вы пришли к выводу, что код работает правильно для будущих дат.
Cary Swoveland 10.04.2019 18:58
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
0
4
78
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я предполагаю, что это что-то в вашей кодовой базе, чего здесь не было, но, вообще говоря, текущая логика справляется с этим. Обновленный образец, который показывает это:

require 'date'

expiry_date = Date.new(2019,4,1) 

def calculate_date_difference(expiry_date)
  (expiry_date - Date.today).to_i
end

message = if calculate_date_difference(expiry_date).between?(0,90)
  "90 days or less"
elsif calculate_date_difference(expiry_date) > 90
  "more than 90 days"
else 
  "past"
end

message == "past" # true

Другие вопросы по теме