在Rails 3中将UTC转换为本地时间

时间:2011-03-14 15:11:10

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

我无法在Rails 3中将UTC TimeTimeWithZone转换为本地时间。

moment是UTC中的一些Time变量(例如moment = Time.now.utc)。如何将moment转换为我的时区,照顾DST(即使用EST / EDT)?

更准确地说,如果时间对应于美国东部夏令时间上午9点和“3月7日上午9点”,如果时间是美国东部时间上午9点,那么我打算打印出“3月14日上午9点”。< / p>

希望还有另一种方式吗?

编辑I first thought“EDT”应该是公认的时区,但“EDT”不是实际时区,更像是时区的状态。例如,要求Time.utc(2011,1,1).in_time_zone("EDT")没有任何意义。这有点令人困惑,因为“EST” 是一个实际的时区,在一些不使用夏令时的地方使用,并且是(UTC-5)一年。

6 个答案:

答案 0 :(得分:108)

Time#localtime将为您提供运行代码的机器当前时区的时间:

> moment = Time.now.utc
  => 2011-03-14 15:15:58 UTC 
> moment.localtime
  => 2011-03-14 08:15:58 -0700 

更新:如果您想要转移到特定的时区而不是您自己的时区,那么您就是在正确的轨道上。然而,不要担心EST与EDT,只要通过一般的东部时区 - 它将根据当天知道它是EDT还是EST:

> Time.now.utc.in_time_zone("Eastern Time (US & Canada)")
  => Mon, 14 Mar 2011 11:21:05 EDT -04:00 
> (Time.now.utc + 10.months).in_time_zone("Eastern Time (US & Canada)")
  => Sat, 14 Jan 2012 10:21:18 EST -05:00 

答案 1 :(得分:104)

Rails有自己的名字。见:

rake time:zones:us

您还可以为所有时区运行rake time:zones:all。 要查看与区域相关的更多rake任务:rake -D time

所以,转换为EST,自动满足DST:

Time.now.in_time_zone("Eastern Time (US & Canada)")

答案 2 :(得分:15)

基本营实际上有一个名为local_time的好宝石,只在客户端做所有这些,我相信:

https://github.com/basecamp/local_time

答案 3 :(得分:10)

使用系统本地区域轻松配置它, 就在你的application.rb中添加这个

config.time_zone = Time.now.zone

然后,rails应该在您的本地时间显示时间戳,或者您可以使用类似此指令的内容来获取本地时间

Post.created_at.localtime

答案 4 :(得分:0)

不知道为什么,但就我而言,它并没有像之前建议的那样工作。 但它的工作原理如下:

Time.now.change(offset: "-3000")

当然,您需要将offset值更改为您的值。

答案 5 :(得分:0)

如果您实际上只是因为要获取用户的时区而这样做,那么您要做的就是在config/applications.rb中更改您的时区。

赞:

默认情况下,即使您指定了当前时区,Rails也会将您的时间记录保存在UTC中。

config.time_zone = "Singapore"

这就是您要做的一切,而且您很高兴。