Ruby比较时间对象会考虑日期。如何避免呢?

时间:2019-02-14 17:43:07

标签: ruby datetime 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

为了使两个实例成为同一类,我使用.zone方法更改了Time类

>>  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总是附加一个日期。

我当然可以提取小时,分钟,时间,创建一个整数并进行比较,但是感觉太多了。

  • 如何用Ruby方式解决此问题?
  • 时间对象始终是带有日期的时间?除了时间,没有其他方法可以实现时间吗?
  • 解决此问题的最佳方法是什么?

我这样解决了:

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 :(得分:1)

您可以对休假进行权衡以获取剩余时间值。

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纪元有任何了解,则模数运算将非常清楚。