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