我的数据库中的订单created_at
非常重要。
当客户创建新订单并因此保存到数据库时,created_at
提前一小时,例如如果在3:00创建订单,则DB中的created_at
将为2:00。
我实际配置了application.rb
以解决问题:
# timezone
config.time_zone = 'Paris'
config.active_record.default_timezone = :local
但是当我在控制器中进行时间比较时,它确实有效。
Order.where("created_at >= :start_time and meal_id = :meal", start_time: DateTime.new(Date.today.year, Date.today.month, Date.today.day - 1, 17, 0, 0), meal: @meal.ids[0])
以上代码应显示自昨天下午5:00以来创建的所有订单,但实际上缺少从下午5:00到下午6:00创建的订单。
再次,当我在Active Admin中查看我的桌子时,每餐的created_at
是正确的,但是在控制台中查看它时提前一小时。
我该如何解决这个问题?
答案 0 :(得分:1)
请尝试1.day.ago
,其中考虑了您的代码所没有的时区。
Order.where("created_at >= :start_time and meal_id = :meal", start_time: 1.day.ago, meal: @meal.ids[0])
如果您想要特定时间的开头,正如您的代码所暗示的那样,请尝试1.day.ago.beginning_of_hour
:
Order.where("created_at >= :start_time and meal_id = :meal", start_time: 1.day.ago.beginning_of_hour, meal: @meal.ids[0])
旁注:使用Rails,如果你发现自己正在进行某种复杂的日期操作,你应该看看Rails是否已经支持它了。还有更多函数here
答案 1 :(得分:1)
数据库中的时间是UTC时间,它已正确存储。因此,您可以与utc时间进行比较以获得预期结果:
16:00
因此,如果数据库在utc中存储Count - (int)pow(2, maxD) + 1;
,则表示您所在时区的下午5点。
答案 2 :(得分:0)
好的,在尝试了几件事后,实际上有两个问题:
确实,第一个是关于时间的。第二个是@meal变量(我使用.where
来获得正确的餐点,但使用.find_by
使其正常工作)
我在我的DateTime对象的末尾添加了一个"+01:00"
,它完成了诀窍:
Order.where("created_at >= :start_time and meal_id = :meal", start_time: DateTime.new(Date.today.year, Date.today.month, Date.today.day - 1, 17, 0, 0, "+01:00"), meal: @meal.id)