Rails应用时区问题:保留PCT选择框并实现日期过滤
解决Rails时区匹配问题:保留PCT显示并正确过滤
嘿,这个时区不匹配的坑我之前也踩过,咱们来一步步搞定它!
问题根源
你遇到的核心问题是:DateTime.strptime 默认会把解析出来的时间当成UTC时区,而你的数据库存储的是local时区(也就是你配置的Pacific Time)。即便你后续调用.in_time_zone,也是把UTC时间转换为PCT,这和你select框显示的PCT时间对应的实际时间不匹配,自然查不到结果。
解决方案:解析时直接指定时区
改用Time.strptime替代DateTime.strptime,并通过in参数指定解析时使用Pacific Time时区。这样得到的时间对象会直接和数据库存储的local时区时间对齐。
修改你的查询代码如下:
# 先解析用户选择的PCT时间字符串,直接生成对应时区的时间对象 selected_time = Time.strptime(params[:date], "%m/%d/%Y - %l:%M %p", in: "Pacific Time (US & Canada)") # 用这个时区正确的时间对象做区间查询 @summary_history = SummarySheet.where( record_inserted_at: selected_time.at_beginning_of_minute..selected_time.at_end_of_minute )
为什么这个方法有效?
- 你在
application.rb中配置了config.active_record.default_timezone = :local,且config.time_zone = 'Pacific Time (US & Canada)',所以数据库中存储的record_inserted_at是PCT时区的时间。 Time.strptime的in参数会告诉Ruby:“这个时间字符串是Pacific Time时区的,直接按这个时区解析”,得到的selected_time就是PCT时区的时间对象,和数据库存储的时间时区完全一致,区间查询自然能匹配到正确结果。
验证小技巧
你可以在Rails控制台里测试解析结果,确认时区是否正确:
# 模拟用户选择的时间字符串 date_str = "10/05/2024 - 2:30 PM" # 按PCT时区解析 time = Time.strptime(date_str, "%m/%d/%Y - %l:%M %p", in: "Pacific Time (US & Canada)") # 查看结果:应该显示PCT时间 puts time.localtime # => 2024-10-05 14:30:00 -0700 # 对应的UTC时间 puts time.utc # => 2024-10-05 21:30:00 UTC
对比数据库中record_inserted_at的存储值,确认和time.localtime格式一致,这样查询就不会出错了。
内容的提问来源于stack exchange,提问作者Mohammed Sayer
相关产品推荐
相关产品推荐

