Подтвердить что ты не робот

Рассчитать разницу в днях ActiveSupport: TimeWithZone в самом "рубиновом" стиле?

У меня есть чувство, что кто-то собирается указать мне на другой вопрос, который отвечает на это, но я искал не повезло по этой простой проблеме.

У меня есть Activerecord с свойством datetime. Он возвращается как ActiveSupport: TimeWithZone. Я знаю, что не могу сравнивать это с DateTime.now, потому что это не включает зону, поэтому мне нужно использовать Time.zone. Имеет смысл.

То, что мне интересно, это стиль, есть ли "более чистый" способ сделать это, чем вычесть и делить результат на 86400?

Вот что я делаю:

((Time.zone.now - myActiveRecord.visit_date)/86400).to_i

Работает, но кажется некрасивым, и я чувствую, что что-то упускаю. Должен ли я бросать, сравнивать или преобразовывать какой-то другой маршрут или это действительно типичный способ сделать это в рельсах? Оцените любые советы или ссылку на вопрос, который уже охватывает это.

Спасибо

4b9b3361

Ответ 1

Одна вещь, которую вы можете сделать, чтобы сделать ее более читаемой:

((Time.zone.now - myActiveRecord.visit_date) / 1.day).to_i

Edit:

На самом деле вы можете избавиться от одного набора скобок:

(Time.zone.now - myActiveRecord.visit_date).to_i / 1.day

Ответ 2

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

Например, мне нужен был мой код, чтобы сообщить мне, что 31 декабря 2010 года за 366 дней до 1 января 2012 года и что 31 декабря 2010 года 23:59 на 1 день с 1 января 2011 года 00:00, Метод выше работает в первом, но в последнем случае он говорит, что они находятся на расстоянии 0 дней.

В результате я использовал класс Ruby Date для выполнения математики для меня. Используя вышеприведенный код, мой метод выглядит следующим образом:

(Time.zone.now.to_date - myActiveRecord.visit_date.to_date).to_i

Это будет работать со входами в Time или DateTime из-за преобразования. Другим возможным решением было бы сначала вызвать beginning_of_day для каждого из Times или DateTimes, но в моем случае важны минуты.

Ответ 3

У Rails на самом деле есть метод, построенный для такого рода вещей.

checkout # time_ago_in_words

Итак, для исходного случая...

((Time.zone.now - myActiveRecord.visit_date)/86400).to_i

против

time_ago_in_words(myActiveRecord.visit_date)