我有一个活动,start_time并且end_time想要检查活动是否"正在进行中".那将是检查今天的日期是否在两个日期之间的范围内.
你会如何在一个函数中做到这一点?
hea*_*thd 237
在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>'
Run Code Online (Sandbox Code Playgroud)
而是使用#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
Run Code Online (Sandbox Code Playgroud)
Dig*_*oss 58
===实际上,有一个运营商会这样做.使用运算符创建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
Run Code Online (Sandbox Code Playgroud)
irb示例也工作正常,但在某些实验中并不总能正确地再现交互式示例.这个更容易切割和粘贴.
它现在全部理顺了.
Aar*_*ron 36
如果你正在使用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
Run Code Online (Sandbox Code Playgroud)
ste*_*lag 15
由于日期类包含Comparable模块,因此每个日期对象都有一个between?方法.
require 'date'
today = Date.today
tomorrow = today + 1
one_month_later = today >> 1
tomorrow.between?(today, one_month_later) # => true
Run Code Online (Sandbox Code Playgroud)
概括
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
Run Code Online (Sandbox Code Playgroud)
如果您使用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
Run Code Online (Sandbox Code Playgroud)
注意:我刚刚使用beginning_of_day并end_of_day提供了一个简单的范围.重要的部分是include_with_range?Range上的方法.
| 归档时间: |
|
| 查看次数: |
57966 次 |
| 最近记录: |