とのイベントがstart_time
ありend_time
、イベントが「進行中」かどうかを確認したいと思います。それは、今日の日付が2つの日付の間の範囲内にあるかどうかを確認することです。
関数でこれをどのように行いますか?
回答:
===
実際、これを行うオペレーターがいます。を作成し、演算子を使用してオブジェクトをRange
比較しTime
ます===
。
start = Time.now.to_i
range = start..(start + 2)
inside = start + 1
outside = start + 3 # ok, now...
range === inside # true
range === outside # false
irb
例も正常に機能しましたが、一部の実験ではインタラクティブな例が常に正しく再現されるとは限りませんでした。これはカットアンドペーストが簡単です。
今ではすべてがまっすぐになっています。
.to_i
使用する必要があり===
ます。IMO.coverage?
は、日付のより良い解決策です。
Ruby 1.9.2 ===
が機能しない場合、エラーが発生します。
irb(main):019:0> (Time.now .. (Time.now+1)) === Time.now
TypeError: can't iterate from Time
from (irb):19:in `each'
from (irb):19:in `include?'
from (irb):19:in `include?'
from (irb):19:in `==='
from (irb):19
from /opt/ruby192/bin/irb:12:in `<main>'
代わりに#cover?
:を使用してください
irb(main):002:0> (Time.now..Time.now+4).cover?(Time.now)
=> true
irb(main):003:0> (Time.now..Time.now+4).cover?(Time.now+10)
=> false
cover?
方法に気づいていなかった
Date
も同様に機能します(Date.yesterday..Date.tomorrow).cover?(Date.today) => true
===
Ruby1.9.2では正常に動作します。あなたはただ忘れました.to_i
Railsを使用してTimeWithZone#between?
いる場合は、を使用できます。次に、次のようなものがあります。
> start_time = Time.zone.parse('12pm') => Thu, 26 Jul 2012 12:00:00 EDT -04:00
> end_time = start_time + 1.hour => Thu, 26 Jul 2012 13:00:00 EDT -04:00
> inside = Time.zone.parse('12:30pm') => Thu, 26 Jul 2012 12:30:00 EDT -04:00
> outside = Time.zone.parse('1:30pm') => Thu, 26 Jul 2012 13:30:00 EDT -04:00
> inside.between?(start_time, end_time) => true
> outside.between?(start_time, end_time) => false
日付クラスにはComparableモジュールが含まれているため、すべての日付オブジェクトにはbetween?
メソッドがあります。
require 'date'
today = Date.today
tomorrow = today + 1
one_month_later = today >> 1
tomorrow.between?(today, one_month_later) # => true
Railsを使用している場合は、次のことを試すことができます。
ruby-1.8.7-p299 :015 > a = DateTime.now
=> Fri, 02 Dec 2011 11:04:24 -0800
ruby-1.8.7-p299 :016 > (a.beginning_of_day..a.end_of_day).include_with_range? a
=> true
ruby-1.8.7-p299 :017 > (a.beginning_of_day..a.end_of_day).include_with_range? a+10.days
=> false
ruby-1.8.7-p299 :018 > (a.beginning_of_day..a.end_of_day).include_with_range? a+25.hours
=> false
ruby-1.8.7-p299 :019 > (a.beginning_of_day..a.end_of_day).include_with_range? a+2.hours
=> true
注:私は使用beginning_of_day
しend_of_day
たばかりで、簡単な範囲を提供します。重要な部分は、include_with_range?
範囲のメソッドです。
include_with_range
範囲が範囲と比較されていた場合ではなかったので、なぜ私が使用することを選んだのかわかりません。おそらくある種の脳腫瘍。良いキャッチ、@ TylerRickに感謝します。@heathdの答えは本当に最高のものです。
タイムスタンプの場合:
def in_progress? (start_time..end_time).include?(Time.now) 終わり
TypeError: can't iterate from Time
チェックされるのは、2つの日付の間の現在の日付です。Rubyの使用
currentDate = DateTime.now
start_date = "2017-03-31"
end_date = "2018-03-31"
currentDate.between?(start_date, end_date)
**Out Put Will be** true or false
概要
d1 = DateTime.parse('2018/04/01')
d2 = DateTime.parse('2018/04/29')
outside = DateTime.parse('2018/04/30')
inside = DateTime.parse('2018/04/15')
# include?
(d1...d2).include?(d1) # true
(d1...d2).include?(d2) # false
(d1...d2).include?(outside) # false
(d1...d2).include?(inside) # true
(d1..d2).include?(d1) # true
(d1..d2).include?(d2) # true
(d1..d2).include?(outside) # false
(d1..d2).include?(inside) # true
# ===
(d1...d2) === d1 # true
(d1...d2) === d2 # false
(d1...d2) === outside # false
(d1...d2) === inside # true
(d1..d2) === d1 # true
(d1..d2) === d2 # true
(d1..d2) === outside # false
(d1..d2) === inside # true
# cover?
(d1...d2).cover?(d1) # true
(d1...d2).cover?(d2) # false
(d1...d2).cover?(outside) # false
(d1...d2).cover?(inside) # true
(d1..d2).cover?(d1) # true
(d1..d2).cover?(d2) # true
(d1..d2).cover?(outside) # false
(d1..d2).cover?(inside) # true
# between?
d1.between?(d1, d2) # true
d2.between?(d1, d2) # true
outside.between?(d1, d2) # false
inside.between?(d1, d2) # true