Я пытаюсь рассчитать разницу в днях (как целое число) между двумя датами. Как мне справиться с разницей, если это отрицательное целое число?
Вот пример моего кода.
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
? Если это строка, вам нужно Date.parse
в Date
. Также стоит отметить, что вы вызываете этот метод более одного раза, а это означает, что вам нужно выполнять вычисления несколько раз. Вместо этого сделайте расчет один раз, сохраните его в переменной, а затем сравните.
Вот где была моя проблема - я не использовал Date.parse в строке. Теперь работает как положено, спасибо
"2019-04-20" - Date.today #=> NoMethodError (undefined method '-' for "2019-04-20":String)
, поэтому я не понимаю, как вы пришли к выводу, что код работает правильно для будущих дат.
Я предполагаю, что это что-то в вашей кодовой базе, чего здесь не было, но, вообще говоря, текущая логика справляется с этим. Обновленный образец, который показывает это:
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
У меня работает, а как вы создаете свой
expiry_date
?