100

我无法在 Rails 3 中转换 UTCTimeTimeWithZone本地时间。

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

更准确地说,如果时间对应于美国东部时间今天早上 9 点,我想打印“3 月 14 日星期一,上午 9 点”,如果时间是美国东部时间上周一上午 9 点,我想打印“3 月 7 日星期一,上午 9 点”。

希望有其他方法吗?

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

4

6 回答 6

125

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 
于 2011-03-14T15:16:38.100 回答
117

Rails 有自己的名字。看到他们:

rake time:zones:us

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

因此,要转换为 EST,自动适应 DST:

Time.now.in_time_zone("Eastern Time (US & Canada)")
于 2011-03-14T15:23:10.110 回答
17

使用您的系统本地区域很容易配置它,只需在您的 application.rb 添加这个

config.time_zone = Time.now.zone

然后,rails 应该显示你本地时间的时间戳,或者你可以使用类似这个指令的东西来获取本地时间

Post.created_at.localtime
于 2016-10-28T00:03:25.213 回答
15

实际上local_time,basecamp 调用了一个不错的 Gem,它只能在客户端完成所有这些工作,我相信:

https://github.com/basecamp/local_time

于 2014-03-19T12:21:34.040 回答
1

不知道为什么,但就我而言,它不像之前建议的那样工作。但它是这样工作的:

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

当然,你需要改变offset你的价值。

于 2016-05-22T04:27:07.130 回答
0

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

像这样:

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

config.time_zone = "Singapore"

所以这就是你所要做的,你很高兴。

于 2018-08-07T14:35:29.617 回答