Tôi có một sự kiện với start_timevà end_timevà muốn kiểm tra xem sự kiện có "đang diễn ra" hay không. Đó sẽ là để kiểm tra xem ngày hôm nay có nằm trong khoảng giữa hai ngày không.
Làm thế nào bạn sẽ làm điều này trong một chức năng?
Câu trả lời:
===Trên thực tế, có một nhà điều hành sẽ làm điều này. Tạo Rangevà so sánh Timecác đối tượng với nó bằng ===toán tử.
start = Time.now.to_i
range = start..(start + 2)
inside = start + 1
outside = start + 3 # ok, now...
range === inside # true
range === outside # false
irbVí dụ trước đó cũng hoạt động tốt nhưng ví dụ tương tác không phải lúc nào cũng được sao chép chính xác trong một số thử nghiệm. Cái này dễ cắt và dán hơn.
Tất cả đã được giải quyết ngay bây giờ.
.to_ivà sau đó được sử dụng ===để xem liệu chúng có nằm trong phạm vi hay không. IMO, .coverage?là một giải pháp tốt hơn cho các cuộc hẹn hò.
Trong Ruby 1.9.2 ===không hoạt động, tôi gặp lỗi:
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>'
Thay vào đó hãy sử dụng #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?phương pháp
Datecũng(Date.yesterday..Date.tomorrow).cover?(Date.today) => true
===hoạt động tốt trong Ruby 1.9.2. Bạn chỉ cần quên.to_i
Nếu bạn đang sử dụng Rails, bạn có thể sử dụng TimeWithZone#between?. Sau đó, bạn sẽ có một cái gì đó như thế này:
> 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
Bởi vì lớp ngày bao gồm mô-đun So sánh được, mọi đối tượng ngày đều có một between?phương thức.
require 'date'
today = Date.today
tomorrow = today + 1
one_month_later = today >> 1
tomorrow.between?(today, one_month_later) # => true
Nếu bạn đang sử dụng Rails, bạn có thể thử cách này:
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
Lưu ý: Tôi chỉ mới sử dụng beginning_of_dayvà end_of_dayđể cung cấp một phạm vi dễ dàng. Phần quan trọng là include_with_range?phương thức trên một Phạm vi.
include_with_rangevì nó không phải là trường hợp một phạm vi được so sánh với một phạm vi. Có lẽ là một loại u não nào đó. Bắt tốt, cảm ơn @TylerRick. @heathd câu trả lời thực sự là câu trả lời tốt nhất.
Nếu chúng là dấu thời gian:
def in_progress? (start_time..end_time) .include? (time.now) kết thúc
TypeError: can't iterate from Time
Đã kiểm tra là ngày hiện tại giữa hai ngày. Sử dụng 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
tóm lược
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