ruby — вычислить разницу в днях

#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