【问题标题】:Rails 4 Ignoring UTC conversion to MySQL databaseRails 4忽略UTC转换为MySQL数据库
【发布时间】:2014-11-29 05:30:33
【问题描述】:

我有一个 Rails 4 应用程序,根据最佳实践,它以 UTC 格式将日期存储在我的 MySQL 数据库中。还行吧。

但是,我有一个无法正常工作的场景。

我有一个事件管理器,它总是在寻找要运行的新事件(存储在数据库中)。这些事件根据用户在站点上的操作存储在数据库中。 DB 中的 events 表有一个 execution_date 字段,用于存储事件计划的执行日期。据此,当用户执行创建事件的操作时,事件 execution_date 将转换为 UTC。

在 Rails 中,我使用 Time.now --> 2014-10-04T01:02:10-07:00(我距离 UTC 7 小时)。在 DB 中,这次转换为 UTC,所以我看到了2014-10-04 08:02:10。我觉得这也对。

但问题是事件管理器正在运行下一个查询以获取待执行的事件:

SELECT e.*
                               FROM events e, event_states es
                               WHERE e.execution_date <= NOW()
                               AND es.name = 'Pending'
                               AND es.id = e.event_state_id

当我运行此查询时,NOW() 返回我的本地时间,即 2014-10-04 01:02:25。所以,现在应该执行的事件,将在 7 小时后执行。

因此,总而言之,execution_date 应始终存储在服务器本地时间。

【问题讨论】:

  • 你能配置你的数据库to use UTC time吗?
  • 感谢 mccannf。我终于将查询中的 NOW() 函数替换为 UTC_TIMESTAMP(),效果与您的建议相同。

标签: mysql ruby-on-rails time utc


【解决方案1】:

根据上面的@mccannf 评论,我没有将我的数据库更新为 UTC 时间,但我用

替换了我的查询
SELECT e.*
                               FROM events e, event_states es
                               WHERE e.execution_date <= UTC_TIMESTAMP()
                               AND es.name = 'Pending'
                               AND es.id = e.event_state_id

注意:使用 UTC_TIMESTAMP() 获取 UTC 时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-08
    • 2015-05-23
    • 2017-10-25
    • 2018-11-22
    • 2020-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多