Объекты Ruby Comparing Time учитывают дату.Как этого избежать? - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть модель с атрибутом Time

create_table "opened_intervals", force: :cascade do |t|
    t.time "start"
    t.time "end"

Примером значения может быть:

>>  oi.start
=> Sat, 01 Jan 2000 06:26:00 UTC +00:00

(я живу в Германии)

Если я использую текущее время, я получаю следующее значение:

current_time = Time.now
>>  current_time
=> 2019-02-14 18:36:12 +0100

Если я сравниваю класс обоих объектов, у меня есть

>>  current_time.class
=> Time
>>  oi.start.class
=> ActiveSupport::TimeWithZone

Чтобы сделать оба экземпляра одним и тем же классом,Я изменяю класс Time с помощью метода .zone

>>  Time.zone.now
=> Thu, 14 Feb 2019 17:38:48 UTC +00:00
>>  Time.zone.now.class
=> ActiveSupport::TimeWithZone

Теперь оба экземпляра имеют один и тот же класс.

Если я сравниваю их, я получаю неправильные результаты из-за даты:

>>  oi.start
=> Sat, 01 Jan 2000 06:26:00 UTC +00:00
>>  current_time
=> Thu, 14 Feb 2019 17:40:13 UTC +00:00
>>  current_time < oi.end
=> false

Я думал о создании нового времени с часами, минутами и секундами, но затем у меня возникает та же проблема, Руби всегда добавляет дату.

Конечно, я могу извлечь часы, минуты, время, создайте целое число и сравните их, но это кажется слишком много.

  • Как я могу решить эту проблему Ruby?
  • Объект Time - это всегда время с датой?Разве нет другого способа достичь Времени только со временем?
  • Как лучше всего подойти к этой проблеме?

Я решил это следующим образом:

def to_integer(time)
  hours = time.hour < 10 ? "0#{time.hour}" : time.hour
  minutes = time.min < 10 ? "0#{time.min}" : time.min
  seconds = time.sec < 10 ? "0#{time.sec}" : time.sec
  "#{hours}#{minutes}#{seconds}"
end

Чувствуется слишком много (я мог бы изменить его, но все же слишком сильно)

to_integer(current_time) < to_integer(oi.end)

1 Ответ

0 голосов
/ 14 февраля 2019

Вы можете просто модулировать выходные дни, чтобы получить оставшееся значение времени.

t1 = Time.now
t2 = t2 = Time.at(Time.now.to_i - (5*24*3600))  # later time in day but previous date
tod1 = t.to_i % (24*3600)
=> 69734
tod2 = t2.to_i % (24*3600)
=> 69912

мы можем ясно видеть, что t2 - это более позднее время дня или времени часов, если вы захотите, и операция модуля оченьясно, если вы знаете что-нибудь об эпохе Unix.

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