【发布时间】:2009-06-04 05:58:23
【问题描述】:
我有一个 Rails 应用程序,并且出于时区差异的目的,我将所有时间都以 UTC 格式存储在数据库中。我还通过将表中的“effective_end_date”字段设置为当前时间来使记录过期而不是删除它。然后我在模型中使用命名范围如下:
named_scope :valid, :conditions => ['(effective_end_date IS NULL OR effective_end_date > ?)
AND (effective_start_date IS NULL OR effective_start_date < ?) ',Time.zone.now.gmtime, Time.zone.now.gmtime]
这似乎在我的 Mac 开发机器上运行良好,但是一旦我开始生产,系统时间和我不知道为什么的时间之间似乎存在差异!在 Linux 中键入“日期”命令似乎给出了正确的时间。查看下面的生产日志文件:
sms parser(inparser) daemon is still running at Wed Jun 03 22:38:36 -0700 2009.
[4;35;1mUltrasmsin Load (0.5ms)ESC[0m ESC[0mSELECT * FROM `smsin` WHERE ((effective_end_date IS NULL OR effective_end_date > '2009-06-04 05:28:32')
AND (effective_start_date IS NULL OR effective_start_date < '2009-06-04 05:28:32') )
这是从以下代码行生成的查询:
ActiveRecord::Base.logger.info "sms parser(inparser) daemon is still running at #{Time.now}.\n"
nonConvertedMsgs = Ultrasmsin.valid.find(:all)
“Time.now”显示的第一个命令时间是正确的,但第二次(从命名范围中获取)似乎是错误的! (关闭 10 分钟)
这真的让我感到困惑,因为我认为 Time.zone.now.gmtime 只会转换小时而不会触及分钟,但似乎小时可以转换为 GM 时间,但分钟会减少 10 分钟!
有什么想法吗?
【问题讨论】:
-
只是检查:您的数据库与 Web 应用程序在同一台机器上?我在两者之间的时间略有不同的问题,并最终在请求处理开始时从数据库服务器获取“当前日期时间”,然后将其用作“Time.now”,因为我不是能够保证两者之间的时钟同步。
-
是的,我的数据库和 Web 应用程序在同一台机器 (VPS) 上。令我困惑的是数据库值是正确的,当我使用脚本/控制台键入值时,它似乎也是正确的。您如何从 DB 获取“当前日期时间”并将其设置为 Time.now?这可能是一个解决方案!对于 Jonathan:是的,我的意思是 UTC,我的错误。我会编辑帖子谢谢