【问题标题】:Ruby Comparing Time objects considers date. How to avoid that?Ruby 比较时间对象考虑日期。如何避免这种情况?
【发布时间】:2019-07-08 19:46:11
【问题描述】:

我有一个带有时间属性的模型

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 方式处理此问题?
  • 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)

【问题讨论】:

  • 从午夜开始检查 il 秒数可以提供帮助:api.rubyonrails.org/classes/…
  • 我不太明白你在问什么。顺便提一句。您首先打印出oi.start,然后再比较current_time &lt; oi.end。使用Time.current 将立即产生ActiveSupport::TimeWithZone。并将其与该类的另一个实例进行比较将起作用。但我可能只是不明白这个问题。
  • 我想比较两次,但是日期混在一起,所以我得到了错误的结果。另外,为什么 ruby​​ 存储日期,如果我只是想要时间
  • 根据可能已过时的图表,迁移中的time 列类型将导致datetime column on sqlite3。 PostgreSql 和 MySql 把它变成一个时间列。至于比较,我会第二个@iGian的建议:Time.current.seconds_since_midnight &lt; oi.end.seconds_since_midnight

标签: ruby datetime time


【解决方案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 纪元有所了解,则模运算非常清楚。

【讨论】:

    猜你喜欢
    • 2013-09-01
    • 1970-01-01
    • 2019-12-06
    • 1970-01-01
    • 2013-11-13
    • 2013-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多