Проверьте, совпадают ли две метки времени в Ruby - PullRequest
22 голосов
/ 18 декабря 2011

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

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

Ответы [ 4 ]

40 голосов
/ 18 декабря 2011

Используя стандартную библиотеку, преобразуйте объект Time в Date.

require 'date'

Time.at(x).to_date === Time.at(y).to_date

Дата имеет метод ===, который будет истинным, если два объекта даты представляют один и тот же день.

5 голосов
/ 18 декабря 2011

ActiveSupport определяет хороший to_date метод для Time класса. Вот как это выглядит:

class Time
  def to_date
    ::Date.new(year, month, day)
  end
end

Используя его, вы можете сравнивать временные метки следующим образом:

Time.at(ts1).to_date === Time.at(ts2).to_date

А вот и менее спорный способ без расширения Time класс:

t1 = Time.at(ts1) # local time corresponding to given unix timestamp ts1
t2 = Time.at(ts2)
Date.new(t1.year, t1.month, t1.day) === Date.new(t2.year, t2.month, t2.day)
2 голосов
/ 30 марта 2016

Мы можем использовать beginning_of_day времени и сравнить их: t1.beginning_of_day == t2.beginning_of_day Таким образом, часовые пояса не будут затронуты.

2 голосов
/ 18 декабря 2011
Time.at(ts1).day == Time.at(ts2).day && (ts1 - ts2).abs <= 86400

Или

t1 = Time.at(ts1)
t2 = Time.at(ts2)
t1.yday == t2.yday && t1.year == t2.year

В первом случае мы проверяем, что метки времени расположены не более чем на один день (потому что #day возвращает день месяца и без этой дополнительной проверки 1 апреля будет равно 1 мая)

Альтернатива - взять день года и убедиться, что они одного и того же года.

Эти методы одинаково хорошо работают как в 1,8, так и в 1,9: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...