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

Mar*_*une 91 ruby timezone ruby-on-rails activesupport ruby-on-rails-3

我在Rails 3中转换UTC TimeTimeWithZone本地时间时遇到问题.

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

更确切地说,如果时间对应于美国东部夏令时间上午9点和"3月7日上午9点",如果时间是美国东部时间上周一上午9点​​,我打算打印出"3月14日星期一上午9点​​".

希望还有另一种方式吗?

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

Dyl*_*kow 112

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

> moment = Time.now.utc
  => 2011-03-14 15:15:58 UTC 
> moment.localtime
  => 2011-03-14 08:15:58 -0700 
Run Code Online (Sandbox Code Playgroud)

更新:如果您想要转换到特定时区而不是您自己的时区,那么您就是在正确的轨道上.然而,不要担心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 
Run Code Online (Sandbox Code Playgroud)

  • "localtime"方法很酷,但运行代码的机器的时区不如访问Web应用程序的用户的时区有用.(如此处所述:http://stackoverflow.com/questions/6003491/rails-3-user-timezones/6105487#6105487)您如何获得用户访问Web应用程序的时区? (6认同)

Zab*_*bba 106

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

rake time:zones:us
Run Code Online (Sandbox Code Playgroud)

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

因此,要转换为EST,自动满足DST:

Time.now.in_time_zone("Eastern Time (US & Canada)")
Run Code Online (Sandbox Code Playgroud)

  • 如何为访问Web应用程序的用户自动使用时区? (21认同)
  • 自动将时区添加到所有ActiveRecord日期时间 - config.time_zone ='东部时间(美国和加拿大)' - 在config/application.rb中 (2认同)

mah*_*ich 15

实际上有一个很好的Gem叫做local_timebasecamp,只在客户端做所有这些,我相信:

https://github.com/basecamp/local_time


jac*_*614 12

可以使用系统本地区域轻松配置它,只需在您的application.rb中添加即可

config.time_zone = Time.now.zone
Run Code Online (Sandbox Code Playgroud)

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

Post.created_at.localtime
Run Code Online (Sandbox Code Playgroud)