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

Проверьте, есть ли две метки времени в тот же день в Ruby

Я немного смущен между Date, Datetime и Time in Ruby. Что еще, мое приложение чувствительно к часовым поясам, и я не уверен, как конвертировать между этими тремя, будучи устойчивым к часовому поясу.

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

4b9b3361

Ответ 1

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

require 'date'

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

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

Ответ 2

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)

Ответ 3

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: -)

Ответ 4

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