【问题标题】:Comparing the DateTime Objects in Ruby on Rails比较 Ruby on Rails 中的 DateTime 对象
【发布时间】:2014-12-17 18:44:37
【问题描述】:

我正在尝试将从 Active Record 对象访问的 DateTime 值与当前时间进行比较。 但无法找到任何内置方法来做到这一点。 我尝试使用

    DateTime.now > @model_name.schedule_time

但这并没有给出预期的结果(可能是字符串比较)。

有没有准确的方法来与当前时间进行比较。

【问题讨论】:

  • schedule_time 返回什么类型?尝试用@model_name.schedule_time.class检查它
  • 这可能取决于您的表定义、您使用的数据库,或者schedule_time 的定义方式?
  • schedule_time 是 datetime 类型

标签: ruby-on-rails ruby


【解决方案1】:

在不知道@model_name.schedule_time 的类型的情况下回答这个问题有点棘手。

但是在 Rails 中 ActiveSupport 提供了 #past?#future?DateDateTimeTime 实例的方法,这样应该可以解决您的问题:

Date.yesterday.past? => true
Time.now.end_of_day.future? => true
DateTime.now.beginning_of_day.past? => true

如果@model_name.schedule_time 没有响应这些方法,那么它不是这些类型之一,这说明你尝试的比较不起作用。

【讨论】:

  • @model_name.schedule_time 是日期时间类型。我试过@model_name.schedule_time.past?但在 Rails 控制台中不返回任何内容。
  • 奇怪。你的rails版本是什么? @model_name.schedule_time.inspect 返回什么?
  • @model_name.schedule_time.inspect 返回“2014 年 12 月 17 日星期三 16:05:00 UTC +00:00”。我不知道发生了什么,现在它返回真或假。但行为是相反的。即使时间过去了,它也会返回 false。 DateTime.now 输出为“2014 年 12 月 17 日星期三 17:38:06 +0530”。
  • 输出肯定确认您有一个 DateTime 实例。但是,您的 schedule_time 以 UTC 时间(协调世界时)表示,而您的本地时间以 IST(印度标准时间,偏移量为 5:30 小时)表示。您传递的本地时间在转换为 utc 时给出“Wed, 17 Dec 2014 12:08:06 +0000”,这确实比您的 schedule_time“小”(使用 DateTime.now.utc 来查看)
  • 感谢您的解释,使用@model_name.schedule_time.to_datetime.past?解决了这个问题。
猜你喜欢
  • 2015-11-16
  • 1970-01-01
  • 2011-09-30
  • 1970-01-01
  • 1970-01-01
  • 2012-11-17
  • 1970-01-01
  • 2017-09-21
  • 1970-01-01
相关资源
最近更新 更多