我有一个rails应用程序,我将所有时间都存储在数据库中,用于TimeZone差异的目的。我也通过将表中的“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中键入“date”命令似乎给出了正确的时间。查看下面的生产日志文件:
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分钟!
有什么想法吗?
答案 0 :(得分:1)
在Mac开发机器上,所有内容 - DBMS,Rails,浏览器 - 可能都在一个时区运行,而且它是您的时区。
在您的生产计算机上,某些内容可能会在不同的时区运行。 DBMS如何处理客户端时区与数据库时区之间的差异,具体取决于DBMS。有些在DBMS的时区中运行 - 在启动时在其环境中设置的时区。有些人会考虑客户的时区。有时候,没有简单的方法可以找到客户的时区。
一般来说,现代世界的时区是UTC的1小时的倍数。有一些例外 - 印度(+05:30)和纽芬兰(-04:30)都是UTC时间半小时的倍数,而尼泊尔则是(+05:45)。但是,格式错误的时区设置可能会导致问题。
另外请记住,客户端和服务器上的时钟可能无法同步到某个原子钟,因此机器上缺少SNTP(NTP)服务可能导致10分钟的漂移。