web-dev-qa-db-ja.com

rubyでの日付/時刻の比較

私はこれらの日時を持っています:

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 UTC2014-09-27 16:11:14 +0200よりも大きいのはなぜですか?

11
user984621

日付をUTCとして処理するため、タイムゾーンの問題を回避できます

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

どこでも、時間Aが時間Bの後に来る場合、AはBより大きいと見なされます。あなたの場合も同じです。


schedule.day_start#=> 2014-09-27 15:30:00 UTC

date_now + 60.minutes#=> 2014-09-27 16:11:14 + 0200これは2014-09-2714:11:14UTCです。

ここで、Time.now + 60.minutesがschedule.day_startの前のtimestampであることがはっきりとわかります。したがって、schedule.day_startはTime.now + 60.minutesよりも大きいため、"if"の場合は当てはまらず、したがって[〜#〜] no [〜# 〜]が出力されます。

0
coderGuy

結果はfalseであることに注意してください。これは、GMTがこれを解決し、UTCを使用してGMTなしの唯一の日時を比較するには、次のことを試してください。

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
0

なぜなら

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

と同時に

2014-09-27 14:11:14 UTC

前に来る

2014-09-27 15:30:00 UTC

Timeオブジェクトの場合、「follows」は「greater」に変換されます。

0
sawa