【问题标题】:Rails 3.1 Time zone, totally stumpedRails 3.1 时区,完全被难住了
【发布时间】:2012-02-06 08:58:09
【问题描述】:

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

  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

我得出的时间是正确的......感谢任何帮助。

【问题讨论】:

  • 为什么friend.last_contact = status.created_at 不起作用?
  • 对不起,你看到的只是我最后一次尝试.. status.created_at 最终在数据库中得到了相同的不正确 utc 值..
  • 我应该补充一下,我也试过了:friend.last_contact = Time.now 在守护程序文件中以及friend.last_contact = Time.zone.now 两者都没有工作,同样被误导UTC

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


【解决方案1】:

我也在同样的问题上苦苦挣扎,也来自 Twitter(尽管这并不真正相关)。

三个想法:

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

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

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

【讨论】:

  • 服务器在 +4 GMT 莫斯科时间.. 这是我错了的偏移量.. 我认为这并不重要,因为无论如何它都以 UTC 形式保存到数据库中?我的服务器应该是 UTC 时间吗?
  • 是的,保存记录时服务器会判断时区偏移量。所以有你的问题。您需要将服务器设置为 UTC,或者通过设置 config.time_zone = 'Moscow' 告诉 Rails 使用本地时间。顺便说一句,您能否“接受”我的回答,以便我获得信用? :-)
  • 呵呵,本来想先试试的,反正我现在就接受了。如果它不起作用,请回帖。不过还是谢谢! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-20
  • 2012-02-19
  • 1970-01-01
  • 2012-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多