У меня есть модель с атрибутом 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)