红宝石中的日期/时间比较

时间:2014-09-27 13:19:08

标签: ruby-on-rails ruby date time comparison

我有这些日期和时间:

schedule.day_start    # => 2014-09-27 15:30:00 UTC
date_now = Time.now   # => 2014-09-27 15:11:14 +0200
date_now + 60.minutes # => 2014-09-27 16:11:14 +0200

我正在尝试检测在day_start之前60分钟或更短时间内开始的所有计划。使用以下代码,我得到的回复是"NO",而不是"YES"

if schedule.day_start < (Time.now + 60.minutes)
  "YES"
else
  "NO"
end

为什么2014-09-27 15:30:00 UTC大于2014-09-27 16:11:14 +0200

4 个答案:

答案 0 :(得分:10)

将它们作为UTC工作日期,这样可以避免出现时区问题

if schedule.day_start.utc < (Time.now + 60.minutes).utc
  ...

答案 1 :(得分:0)

由于

2014-09-27 16:11:14 +0200

同时

2014-09-27 14:11:14 UTC

之前的

2014-09-27 15:30:00 UTC

使用Time个对象,&#34;跟随&#34;转换为&#34;更大&#34;。

答案 2 :(得分:0)

在任何地方,如果时间A在时间B之后出现,那么A被认为大于B.同样在你的情况下。

  

schedule.day_start#=&gt; 2014-09-27 15:30:00 UTC

     

date_now + 60.minutes#=&gt; 2014-09-27 16:11:14 +0200这是2014-09-27 14:11:14 UTC。

在这里,你可以清楚地看到,time.now + 60.minutes是schedule.day_start之前的时间戳。因此,schedule.day_start大于Time.now + 60.minutes,这就是为什么你的“if”情况不成立,因此打印 NO

答案 3 :(得分:0)

请记住您的结果为 false ,因为格林尼治标准时间(GMT)要解决此问题并比较不使用格林尼治标准时间(UTC)的唯一日期时间,请尝试以下操作:

minutes = 60.minutes 
t1 = Time.at(schedule.day_start.utc).to_datetime
t2 = Time.at((Time.now + minutes).utc).to_datetime

if t1 < t2
  "YES"
else
  "NO"
end