【问题标题】:Rails datetime comparisonRails 日期时间比较
【发布时间】:2018-05-29 14:01:02
【问题描述】:

我的应用程序提供了创建具有特定格式的开始日期和结束日期的事件的机会。事件不应持续超过两周,因此事件控制器使用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,但那是不正确的。

【问题讨论】:

    标签: ruby-on-rails ruby datetime time


    【解决方案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
    

    【讨论】:

      【解决方案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?

      【讨论】:

      • 谢谢,我能做到,但是我仍然不知道为什么 Rails 认为整数是秒而不是天
      • 22.days 创建一个 Duration api.rubyonrails.org/classes/Numeric.html#method-i-days 的实例,它本身在内部使用秒来表示持续时间 api.rubyonrails.org/classes/ActiveSupport/Duration.html
      • 但是 22 是天,而不是秒。 22.days == (86400 x 22).seconds。据我所知,如果持续时间以秒为单位,那么结果应该是 1900800,而不是 22,恕我直言。
      • 你必须小心你从另一个中减去什么。如果你减去Date,你会得到天数的差异。如果你减去Times,你会得到秒数。
      • 这取决于:-) 有时您不需要秒的粒度。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-04
      • 1970-01-01
      • 2023-03-29
      相关资源
      最近更新 更多