Tôi có một sự kiện với start_time
và end_time
và 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 Range
và so sánh Time
cá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
irb
Ví 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_i
và 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
Date
cũ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_day
và 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_range
vì 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