내가 가진 이벤트가 start_time
및 end_time
이벤트 "가 진행 중"인지 확인하고 싶습니다. 오늘 날짜가 두 날짜 사이의 범위에 있는지 확인하는 것입니다.
함수에서이 작업을 어떻게 수행합니까?
답변:
===
실제로이를 수행하는 운영자가 있습니다. 을 확인 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
===
Ruby 1.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
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
두 날짜 사이의 현재 날짜를 선택합니다. 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