当前位置: 首页 > 知识库问答 >
问题:

Ruby通过比较对象的时间来考虑日期。如何避免这种情况?

杜经艺
2023-03-14

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

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)

共有1个答案

龚招
2023-03-14

您可以只对Rest日进行模量运算,以获得剩余的时间值。

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纪元的话,模数运算是非常清楚的。

 类似资料:
  • 问题内容: 在Go中进行日期比较是否有任何选择?我必须根据日期和时间- 独立地对数据进行排序。因此,我可以允许一个对象在一定日期范围内发生,只要它也在一定时间范围内出现即可。在此模型中,我不能简单地选择最旧的日期,最年轻的时间/最新的日期,最新的时间和Unix()秒来比较它们。我真的很感谢任何建议。 最终,我编写了一个时间解析字符串比较模块,以检查时间是否在范围内。然而,这并不顺利。我有一些大问题

  • 问题内容: 当比较Javascript中的日期对象时,我发现即使比较同一日期也不会返回true。 我如何比较这些日期的相等性?我对利用JS 的本机对象(而不是任何第三方库)感兴趣,因为它不适合仅使用第三方JS来比较日期。 问题答案: 这是因为在第二种情况下,将比较实际的日期对象,并且两个对象永远不会彼此相等。强迫他们编号: 如果要更明确地转换为数字,请使用以下任一方法: 要么 哦,对规范的引用:§

  • 在这种情况下是否可以避免ArrayIndexOutOfBoundsException??

  • 问题内容: 这是我正在尝试执行的一些代码片段: 我似乎无法比较日期和日期时间值。比较这些的最佳方法是什么?我应该将日期时间转换为日期还是相反?我如何在它们之间转换。 (一个小问题,但似乎有点令人困惑。) 问题答案: 使用该方法将日期时间转换为日期: 或者,您可以使用代替。你可以用 消除之后的时间部分。

  • 代码: 输出:(增加空白行以提高可读性) 有两件事我不明白: null 我还查看了date.equals()的实现: 那么,为什么返回false,尽管为两个对象都返回了1406498400000? 参考:http://docs.oracle.com/javase/7/docs/api/java/util/date.html#equals(java.lang.object)

  • 问题内容: 我正在使用moment.js格式化我的日期时间,这里有两个日期值,当一个日期大于另一个日期时,我想实现一种特定的功能。我阅读了他们的大多数文档,但没有找到实现此目的的功能。我知道会在那里。 这是我的代码: 编辑 在这里,我正在比较两个日期,即,期望第一个日期大于第二个日期,但是它总是转到else条件。不知道为什么 问题答案: 我相信你正在寻找的查询功能,,,和。 但是要确切地说出您要尝