时间和范围问题

时间:2014-03-12 17:51:03

标签: ruby-on-rails ruby date datetime time

我目前正在开发一个Appointment系统并使用Ruby on Rails构建它。我有一个约会模型和约会控制器,在索引上,我想显示那天的约会列表,以30分钟的块分隔。

我有一个基本的工作版本,我有一个ruby方法,在表行上添加一个类,显示当前30分钟块是否是当前时间。

问题是,当时间在小时的开始和结束之间的任何地方时,它将行类设置为“current_time”。这不是我想要的。

def date_class(time)
    now = DateTime.now.utc

    if (now.beginning_of_hour..(now.end_of_hour - 0.5.hours)).cover?(time)
        "current_time"
    elsif ((now.beginning_of_hour + 0.5.hours)..now.end_of_hour).cover?(time)
        "current_time"
    elsif (now.beginning_of_day..now.end_of_hour).cover?(time)
        "past"
    else
        "future"
    end
end

有什么想法吗?

下面的屏幕截图显示代码正常工作并正确显示真或假。

http://s.deanpcmad.com/2014/uifGf.png

2 个答案:

答案 0 :(得分:2)

这不适合你吗?

def date_class(time)
    now = DateTime.now.utc
    return "past" if time < now.beginning_of_hour
    return "current_time" if now.hour == time.hour && now.min < 30 && time.min < 30 
    return "current_time" if now.hour == time.hour && now.min >= 30 && time.min >= 30 
    return "future"
end

我确信有更好的方法,但我认为这也有用

答案 1 :(得分:2)

虽然它目前仅使用类Time的实例进行了测试,但time_frame gem可能是此类问题的替代解决方案:

require 'time_frame'

def date_class(time)
  now = Time.now.utc
  frame = TimeFrame.new(min: now.beginning_of_hour, duration: 29.minutes + 59.seconds)
  frame = frame.shift_by(30.minutes) if now.min >= 30
  return 'past' if frame.deviation_of(time) < 0.minutes
  return 'current_time' if frame.cover?(time)
  'future'
end

# Demo: Building 30.minutes interval blocks and print out the date class used by each block:
frame = TimeFrame.new(
  min: (Time.now.utc - 2.hours).beginning_of_hour,
  max: (Time.now.utc + 2.hours).beginning_of_hour
)
frame.split_by_interval(30.minutes).each do |interval|
  puts "#{interval.min} -> #{date_class(interval.min)}"
end