无法在rails中正确地进行日期/时间比较。时区问题。

时间:2016-01-19 14:55:48

标签: ruby-on-rails timezone

我正在尝试将表格中的日期/时间与当前时间进行比较,以查看该项目是否已过期。我尝试了很多组合,但似乎无法正确调整时区。我在东部标准时间。

  create_table "admin_messages", force: :cascade do |t|
    t.text     "message"
    t.datetime "expires"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

基本思路是我可以添加消息和到期日期,并显示尚未过期的消息。

application.rb
    config.active_record.default_timezone = 'Eastern Time (US & Canada)'
    config.time_zone = 'Eastern Time (US & Canada)'
  end

我已经尝试了多种方法来获取下面的if语句以正常工作无济于事。

 helper_method :show_admin_messages
  def show_admin_messages
    $admin_message = ''
    @admin_messages = AdminMessage.all
    @admin_messages.each do |message|
      if message.expires >= Time.now.in_time_zone("Eastern Time (US & Canada)")

      $admin_message = $admin_message + message.message + "<br>"
      end
    end
  end

如果我在Time.now上尝试了几种变体,我会得到:

Time.now 2016-01-19 09:23:08 -0500 
Time.now.utc 2016-01-19 14:23:08 UTC
Time.now.localtime 2016-01-19 09:23:08 -0500
Time.now.in_time_zone("Eastern Time (US & Canada)") 2016-01-19 09:23:08 -0500

我的问题是试图找出if语句的语法。

2 个答案:

答案 0 :(得分:2)

你可以使用:

if message.expires.past?
  ## it expired
else
  ## not yet
end

答案 1 :(得分:1)

首先,你几乎肯定不想设置config.active_record.default_timezone。默认值为utc - 对于其他时区,您会遇到DST等问题,导致记录以错误的顺序重新创建,等等。

对于绝大多数应用程序,时区仅在向用户呈现输出或接收输入时才相关。过滤是否过期的操作过去或现在不依赖于此:

message.expires <= Time.now

会这样做。

事件会更好

@admin_messages = AdminMessage.where('expires > ?', Time.now)

这样您首先只能从数据库中获取未过期的消息。