如何知道今天的日期是否在日期范围内?

Lan*_*tus 78 ruby date range

我有一个活动,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)

  • 这也适用于“日期”以及“(Date.yesterday..Date.tomorrow).cover?(Date.today) =&gt; true” (2认同)

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)


更新post-comment-flood:此版本适用于所有地方.(在Rails中,在Ruby 1中,在Ruby 2中.)前面的irb示例也工作正常,但在某些实验中并不总能正确地再现交互式示例.这个更容易切割和粘贴.

它现在全部理顺了.

  • 获取TypeError:无法在ruby 2.0中进行迭代 (3认同)
  • 这里有什么收获?和其他两条评论一样,我完全尝试了这段代码,并得到了同样的错误.为什么19个人投票给这个答案?它有用吗?希思德的回答对我有用. (3认同)
  • 注意:要使其工作,您需要转换日期`.to_i`然后使用`===`来查看它们是否在范围内.IMO,`.coverage?`是一个更好的日期解决方案. (2认同)

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)


srg*_*hma 6

概括

  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)


sor*_*ens 5

如果您使用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_dayend_of_day提供了一个简单的范围.重要的部分是include_with_range?Range上的方法.