Ответ 1
Используя стандартную библиотеку, преобразуйте объект Time в Date.
require 'date'
Time.at(x).to_date === Time.at(y).to_date
Дата имеет метод ===
, который будет истинным, если два объекта даты представляют один и тот же день.
Я немного смущен между Date, Datetime и Time in Ruby. Что еще, мое приложение чувствительно к часовым поясам, и я не уверен, как конвертировать между этими тремя, будучи устойчивым к часовому поясу.
Как я могу проверить, соответствуют ли две метки времени unix (секунды с эпохи) в тот же день? (На самом деле я не возражаю, если он использует местное время или UTC, хотя я бы предпочел местное время, если это согласовано, я могу создать вокруг этого).
Используя стандартную библиотеку, преобразуйте объект Time в Date.
require 'date'
Time.at(x).to_date === Time.at(y).to_date
Дата имеет метод ===
, который будет истинным, если два объекта даты представляют один и тот же день.
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)
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 возвращает день месяца и без этой дополнительной проверки Apr 1 будет равен 1 мая)
Альтернативой может стать день и убедиться, что они относятся к тому же году.
Эти методы одинаково хорошо работают как в 1.8, так и в 1.9: -)
Мы можем использовать beginning_of_day
времени и сравнить их:
t1.beginning_of_day == t2.beginning_of_day
Таким образом, не будут затронуты часовые пояса.