无法使 date/time 比较在 rails 中正常工作。时区问题。
Can't get date/time comparison working correctly in rails. Timezone issue.
我正在尝试将 table 中的 date/time 与当前时间进行比较,以查看该项目是否已过期。我尝试了很多组合,但似乎无法针对时区进行适当调整。我在东部标准时间。
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 语句的语法。
您可以只使用:
if message.expires.past?
## it expired
else
## not yet
end
首先,您几乎肯定不想设置 config.active_record.default_timezone
。默认值为 utc - 对于其他时区,您会遇到 DST 等问题,使得记录似乎以错误的顺序重新创建等等。
对于绝大多数应用程序,时区仅在向用户呈现输出或接收输入时才相关。诸如过滤过期是过去还是现在的操作不依赖于此:
message.expires <= Time.now
会的。
更好的活动是
@admin_messages = AdminMessage.where('expires > ?', Time.now)
以便您首先只从数据库中获取未过期的消息。
我正在尝试将 table 中的 date/time 与当前时间进行比较,以查看该项目是否已过期。我尝试了很多组合,但似乎无法针对时区进行适当调整。我在东部标准时间。
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 语句的语法。
您可以只使用:
if message.expires.past?
## it expired
else
## not yet
end
首先,您几乎肯定不想设置 config.active_record.default_timezone
。默认值为 utc - 对于其他时区,您会遇到 DST 等问题,使得记录似乎以错误的顺序重新创建等等。
对于绝大多数应用程序,时区仅在向用户呈现输出或接收输入时才相关。诸如过滤过期是过去还是现在的操作不依赖于此:
message.expires <= Time.now
会的。
更好的活动是
@admin_messages = AdminMessage.where('expires > ?', Time.now)
以便您首先只从数据库中获取未过期的消息。