Rails - 更改Time数据类型中的默认时间

时间:2016-09-24 05:44:53

标签: ruby-on-rails time

在我看来,我将按start_time订购一个项目清单。但是,有些情况可能会出现在{1}上午1:00(第二天)的start_time,应该在start_time晚上11:00之后显示(前一天)。由于Time数据类型存储的默认日期为2001-01-01,因此它将上午1:00的条目视为2001-01-01,而不是2001-01-02。

因此,我的问题是,有没有办法更改Time数据类型中的默认日期?

我认为一个明显的解决方案是将开始和结束时间存储在DateTime数据类型中并输入相应的日期。然而,对于这种应用,习惯上将凌晨1点的开始时间称为“属于”前一天,因此难以进入第二天的日期。 (例如,在星期五晚上参加你最喜欢的乐队音乐会时,他们的演出可能会在星期六早上12:30开始,但你仍然会认为音乐会是在星期五晚上举行的)。谢谢你的帮助。

2 个答案:

答案 0 :(得分:1)

不是您问题的直接答案,而是问题的可能解决方案:您可以创建一个按时间排序的自定义排序<上午1点。

sorted_concerts = Concert.order('CASE WHEN start_time <= "2001-01-01 01:00:00" THEN 2 ELSE 1 END, start_time')

这样您就可以保留db列,但可以获得音乐会的预期订单。除了上午1点的反转,时间通常按升序排序。

答案 1 :(得分:0)

经过更多的研究,它似乎不是&#34; 2001-01-01&#34;的默认日期。可以调整Ruby应用于存储在Time数据类型中的时间。我想这回答了我的问题 - 但是 - 为了解决问题,我将db列更改为datetime数据类型并记录了一个默认日期,如果时间条目是在午夜之后,则会调整。控制器动作如下:

def create
      start_time = DateTime.parse("#{run_of_show_item_params[:date]} #{run_of_show_item_params[:start_time]}")
      end_time = DateTime.parse("#{run_of_show_item_params[:date]} #{run_of_show_item_params[:end_time]}")

      @run_of_show_item = RunOfShowItem.new(run_of_show_item_params)
      @run_of_show_item.start_time = start_time 
      @run_of_show_item.end_time = end_time
      @run_of_show_item.start_time+=1.days if run_of_show_item_params[:start_time] < "07:00"
      @run_of_show_item.end_time+=1.days if run_of_show_item_params[:start_time] < "07:00"
    if @run_of_show_item.save
      flash[:success] = "Performance added!"
      redirect_to :back
    else
      render 'new'
    end
  end