【问题标题】:Inconsistent behavior of Time.now in Ruby/Rails appRuby/Rails 应用程序中 Time.now 的行为不一致
【发布时间】:2009-08-18 00:57:05
【问题描述】:

我有一个 Ruby on Rails 应用程序,它有一个我使用 cron 和脚本/运行程序执行的计划作业。

作业的目的是查找任何过期的更新(“过时”,见下文),并且(在执行作业后)将作业的“到期日期”更新为预定义的分钟数。未来。

我遇到的问题是,当我设置“截止日期”时,使用的是“GMT”时间。但是,当我搜索过时的工作时,似乎使用了“本地”时间。服务器的本地时间与 GMT 相差 -7 小时,因此系统在两次更新之间会多出 7 小时。

示例:作业的截止日期是某天的 06:00。系统在西海岸时间 06:00 (-7 GMT) 找到该作业。如果作业在 15 分钟后再次到期,则它将“到期日期”设置为 06:15,在保存对象时更改为 13:15(未来 15 分钟和 7 小时后)。

我将在下面插入代码。如果有任何区别,'mark_updated' 是模型的一部分,而 self.stale 是同一模型中包含的模块中的类级函数。

顺便说一句...额外的问题 - 如何捕获正在从生产中的脚本/运行器作业执行的 SQL?这将使调试更容易。我对正在发生的事情进行了一些猜测。

def mark_updated
  self.next_refresh_due_at = Time.now + update_interval_in_minutes.minutes
  save
end

def self.stale(max = 3)
  news_sources = NewsSource.find(:all,
                               :conditions => ["next_refresh_due_at < ?", Time.now],
                               :order => 'next_refresh_due_at ASC',
                               :limit => max)

  return news_sources
end

【问题讨论】:

  • 应用服务器是否有可能与 SQL 服务器分开?
  • 他们都在同一个服务器上

标签: ruby-on-rails


【解决方案1】:

我假设您在 environment.rb 配置文件中指定了时区。在这种情况下,您应该使用Time.zone.now 而不是Time.now

请参阅this answer 了解完整说明。

【讨论】:

  • 啊!那成功了。谢谢 - 我昨晚在那个上扯了我的头发。
猜你喜欢
  • 1970-01-01
  • 2016-07-04
  • 2011-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多