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


95

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

说的momentTimeUTC中的一些变量(例如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)的地方使用了一年。

Answers:


113

Rails有其自己的名称。看到他们与:

rake time:zones:us

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

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

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

21
您如何为用户访问Web应用程序自动使用时区?
dmonopoly

我发现的唯一方法是使用Javascript,然后将其传递回服务器。 (new Date()).getTimeZoneOffset()。但这是相当矛盾的,所以这个人似乎写了他自己的:onlineaspect.com/2007/06/08/…–
公爵

2
自动将时区添加到所有ActiveRecord日期时间
-config.time_zone

更新:链接的JS解决方案的所有者指向更新的解决方案:pellepim.bitbucket.org/jstz
Miles

@dmonopoly您可以在应用程序配置中设置时区,config.time_zone = 'Wellington'然后使用Time.current(与time.now等效,但使用您设置的时区)
肖恩(Sean

116

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 

那是一个开始。如何设置当前时区(由于我什至不确定应用程序将在何处托管,因此服务器所在的时区可能与应使用的时区不同)。
马克-安德烈·Lafortune

6
“ localtime”方法很酷,但是运行代码的计算机所在的时区并不如访问Web应用程序的用户所在的时区有用。(如此处所述:stackoverflow.com/questions/6003491/rails-3-user-timezones/…)如何获取用户访问Web应用程序的时区?
dmonopoly

@daze我想您可以为用户设置一个选项,以选择他们的时区,然后将in_time_zone方法与他们的时区一起使用。
Dylan Markow

1
谢谢,本地时间方法正是我所需要的。
鲍勃

Time.now.localtime在正常的irb会话上工作,但是当我尝试在UTC时区的计算机上运行它时,它不起作用。
2013年

15

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

config.time_zone = Time.now.zone

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

Post.created_at.localtime


1

不知道为什么,但是在我的情况下,它不能像前面建议的那样工作。但是它是这样的:

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

当然,您需要改变自己的offset价值。


0

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

像这样:

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

config.time_zone = "Singapore"

因此,这就是您要做的一切,而且您做好了一切。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.