生产和开发之间的奇怪时间不一致

出于某种原因,时间在开发(我的本地Mac)和生产(Heroku)中的表现不同。 看一下:(就在这之前我做了一个heroku db:pull ,所以数据库应该是相同的)

制作(Heroku)

 >> Annotation.last.id => 2028 >> Annotation.last.created_at => Sat, 12 Sep 2009 06:51:33 UTC +00:00 >> Time.zone => #<ActiveSupport::TimeZone:0x2b4972a4e2f0 @tzinfo=#, @utc_offset=0, @name="UTC"> >> Time.now.zone => "PDT" 

开发(我的Macbook Pro)

 >> Annotation.last.id => 2028 >> Annotation.last.created_at => Sat, 12 Sep 2009 09:51:33 UTC +00:00 >> Time.zone => #<ActiveSupport::TimeZone:0x23c92c0 @tzinfo=#, @utc_offset=0, @name="UTC"> >> Time.now.zone => "EDT" 

由于created_at时间相差3小时,我认为这与EDT和PDT之间的3小时差异有关,但我不确定发生了什么。

编辑:这是原始数据的样子:

 sqlite> Select created_at from annotations where id = 2028; 2009-09-12T09:51:33-04:00 

在Heroku和您的开发机器之间移动数据库时,这似乎是一个问题。 直接运行SQL查询给我这个:

 Local: {"created_at"=>"2009-10-30 22:34:55.919586"} Remote: {"created_at"=>"2009-10-31 01:34:55.919586"} 

同样的问题,恰好是三个小时的class次。 通过Taps的源代码,Gem heroku用于数据库同步,但没有提供任何可能出现问题的线索。 我已经打开了一张heroku支持票,我将用我发现的内容更新这篇文章。

更新:来自Heroku的Ricardo和Morten回复道。 在命令行上指定TZ,如下所示:

 TZ=America/Los_Angeles heroku db:pull 

看起来它假设数据库中的日期存储在您的本地时区中,这对于2个环境是不同的,然后将其转换为UTC。 由于DB中的值基本相同,因此您可以获得2个不同的UTC值。

“config / environment.rb”中config.time_zone的值是多少? 另外“从id = 2028的注释中选择created_at”的值是多少?

这是我之前遇到过的一个问题。

如果您在rails控制台上执行类似Annotation.last.created_at的操作,则结果已经应用了时区。 您应该通过mysql控制台查看mysql中的“纯”日期:-)

也许一台或两台机器的系统时间设置设置为本地时区,而不是UTC。 如果是这种情况,那么它会混淆UTC时间(int)实际上是什么值。

两台机器上都有许多区域需要检查:

  • 系统时区
  • 本地(用户)进程时区
  • 数据库系统时区
  • 数据库本地时区

这似乎不能通过一个或另一个报告其当地时间作为UTC时间来解释:东部时间距离UTC 4小时,太平洋时间距离7小时,但您看到的是3小时的差异,而不是4或7小时的差异。

看起来他们两个都在产生不正确的输出。 SQLite显然说09:51时间应该是-04:00时间,即东部时间,但Rails在一个案例中错误地声称它是UTC – 而在另一种情况下,它正在将它从东部转换为太平洋,然后错误地声称结果是UTC。

也许这是ActiveRecord的SQLite后端的错误? 因为它似乎是那种在很久以前被捕获并被压扁的东西,如果它是广泛使用的代码。