Rails日期时间比较

时间:2017-12-15 11:02:14

标签: ruby-on-rails ruby datetime time

我的应用程序提供了使用特定格式创建具有开始日期和结束日期的事件的机会。事件的持续时间不应超过两周,因此事件控制器会使用before_action

检查此情况
def correct_time
  @event = current_user.events.build(event_params)
  if (@event.end_time.to_datetime - @event.start_time.to_datetime) > 2.weeks
    flash[:danger] = "Attention! Events cannot last longer than 2 weeks"
    redirect_to root_url
  end
end

所以当我能够创建以下事件时,我感到很困惑,这个事件持续了22天:

>> event = Event.last
=> #<Event id: 1, user_id: 1, place: "barcelona", start_time: "2017-12-24 10:26", end_time: "2018-01-15 10:26", created_at: "2017-12-15 09:27:13", updated_at: "2017-12-15 09:27:13">

显然这个条件不起作用,因为Rails错误的几天:

>> (event.end_time.to_datetime - event.start_time.to_datetime)
=> (22/1)

>> (event.end_time.to_date - event.start_time.to_date) > 2.weeks
=> false

>> (event.end_time.to_datetime - event.start_time.to_datetime) == 22.days
=> false

>> (event.end_time.to_datetime - event.start_time.to_datetime) == 22.seconds
=> true

除了在上面的表达式中使用14.seconds而不是2.weeks之外,我不知道为什么会发生这种情况以及如何解决这个问题,但这不正确。

2 个答案:

答案 0 :(得分:2)

为什么不使用整数,而不使用.days

(event.end_time.to_date - event.start_time.to_date) == 22 # => true

或转换为时间对象:

(@event.end_time.to_time - @event.start_time.to_time) > 2.weeks

计算两个日期之间的天数有很多种可能性,但必须使用整数进行比较:

(event.start_time.to_date..event.end_time.to_date).count > 14 

请参阅How can I find the number of days between two Date objects in Ruby?

答案 1 :(得分:1)

您可以按如下方式查看活动持续时间:

if (@event.end_time.to_datetime - @event.start_time.to_datetime).to_i > 14
  flash[:danger] = "Attention! Events cannot last longer than 2 weeks"
  redirect_to root_url
end