Rails 3.1时区,完全难倒

时间:2012-01-09 20:44:45

标签: ruby-on-rails ruby-on-rails-3 datetime timezone

我有一个用户模型和一个朋友模型..我正在尝试跟踪用户上次联系朋友的时间。我有一个守护进程收集此信息并将其保存为:

  friend.last_contact = Time.parse(status.created_at) #this is where I go wrong
  friend.save

我从Twitter获取此信息,该信息以UTC格式报告,格式如下:

"Thu Jan 05 23:29:00 +0000 2012"

当我进入rails控制台并执行这些命令时,日期会以UTC时间正确保存为UTC。但是,当我通过一个守护进程收集这些信息时,它会将它保存在带有UTC的数据库中但是使用本地时间...这使得它可以关闭4个小时..我正在使用rails runner运行我的守护程序所以我相信有效的支持应该没事。我不能为我的生活弄清楚出了什么问题..

从我的服务器rails控制台获得一些输出:

1.9.1 :001 > Time.now
=> 2012-01-10 00:40:37 +0400 

1.9.1 :002 > Time.zone.now
 => Mon, 09 Jan 2012 20:40:56 UTC +00:00 

这是20分钟前检索邮件时保存的时间戳:

1.9.1 :009 > b.last_contact
 => Tue, 10 Jan 2012 00:27:20 UTC +00:00 

你会注意到它是服务器的'Time.now'但是保存为UTC ......如果我进入rails控制台而输入的内容让我感到困惑:

> friend.last_contact = Time.now ; friend.save

> friend.last_contact = Time.zone.now ; friend.save

我出现了正确的时间......任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

我也在努力解决同样的问题,而且也是来自Twitter(虽然这并不是真的相关)。

三个想法:

  1. 您在UTC时间运行守护程序的服务器是?时区在Rails 3中的工作方式是时间在保存(之前)时转换为系统时区。所以看起来没问题,直到你坚持这个价值。

  2. 您的test / prod数据库是否可能不是UTC,但您的本地测试数据库是?如果您在托管数据中心运行,有时他们运行的数据库不是UTC,而是在他们托管的任何时区。

  3. 守护程序是否可以在具有不同TZ环境变量(或不同语言环境)的用户帐户下运行? http://www.gnu.org/software/libc/manual/html_node/TZ-Variable.html