You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails中Time.zone.now.end_of_day返回明日日期,如何正确查询当日训练记录?

问题根因

本质是Ruby原生时间方法读取系统时区,和Rails配置的应用时区不匹配导致的日期偏移:Heroku默认系统时区为UTC,美东时间与UTC有4-5小时时差,UTC零点对应美东下午4-5点,就会出现你遇到的下午日期跳变问题。你数据库中存储的workout_date是美东时区的日期,但查询/表单默认值用的Date.today读的是UTC时区的日期,自然匹配不上。


解决方案

1. 配置Heroku系统时区

执行命令设置Heroku应用的系统时区和美东一致:

heroku config:set TZ="America/New_York"

2. 修改控制器查询代码

你的workout_date是DATE类型,无需查询时间区间,直接匹配日期即可,替换原查询逻辑为:

# weights_controller.rb
def index
  # 按Rails配置的时区取当日日期
  @weights_today = Fitness::Weight.where(admin_user_id: session[:user_id])
                   .where(workout_date: Date.current)
                   .order(workout_date: :desc)
  # ...其余逻辑
end

3. 修正表单默认日期

把视图中表单的默认值从Date.today替换为Date.current,保证表单默认填充的是美东时区当日日期:

<%= f.text_field :workout_date, { :size => 20, :type => 'date', :class => "date-picker", :readonly => false, :value => @weight.id ? @weight.workout_date : Date.current } %>

4. 确认ActiveRecord时区配置

在config/application.rb中补充ActiveRecord时区配置,保证数据写入读取的时区一致:

config.time_zone = 'Eastern Time (US & Canada)'
config.active_record.default_timezone = :local

通用注意事项

后续所有代码中要使用Rails提供的Date.current、Time.current获取时间,不要用Ruby原生的Date.today、Time.today:前者读Rails配置的应用时区,后者读操作系统时区,能从根源避免时差问题。


内容的提问来源于stack exchange,提问作者John Cowan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 22:27:03