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

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

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

更准确地说,如果时间是上午9点,“上午9点”,如果时间是上星期一上午9点​​,我想打印出“3月14日星期一上午9点​​”。

希望有另一种方式?

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

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

 rake time:zones:us 

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

所以,转换到EST,自动迎合DST:

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

Time#localtime将给你在运行代码的机器的当前时区的时间:

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

更新:如果你想转换到特定的时区而不是你自己的时区,那么你就是在正确的轨道上。 但是,不要担心美国东部时间和美国东部时间,只需通过东部时区即可,根据美国东部时间是否是美国东部时间或美国东部时间:

 > 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 

实际上有一个很棒的gem,被basecamp称为local_time ,只能在客户端做所有的事情,我相信:

https://github.com/basecamp/local_time

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

 config.time_zone = Time.now.zone 

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

 Post.created_at.localtime 

不知道为什么,但在我的情况下,它不符合前面提出的方式。 但它的工作原理是这样的:

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

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