2009-09-06 72 views
90

created_at时间戳都存储在UTC:从一个时区转换时间到另一个Rails的

>> Annotation.last.created_at 
=> Sat, 29 Aug 2009 23:30:09 UTC +00:00 

如何转换其中之一为“东部时间(美国&加拿大)”(考虑到日光储蓄)?喜欢的东西:

Annotation.last.created_at.in_eastern_time 

回答

159

使用DateTime类

Loading development environment (Rails 2.3.2) 
>> now = DateTime.now.utc 
=> Sun, 06 Sep 2009 22:27:45 +0000 
>> now.in_time_zone('Eastern Time (US & Canada)') 
=> Sun, 06 Sep 2009 18:27:45 EDT -04:00 
>> quit 

这样的in_time_zone方法为您具体的例子

Annotation.last.created_at.in_time_zone('Eastern Time (US & Canada)') 
+6

或者你可以使用小时的ident'now.in_time_zone(3)'' – fl00r 2011-03-24 13:00:14

+7

created_at.in_time_zone (“EST”)更短 – Orlando 2012-06-14 18:00:06

+40

“EST”=“东部标准时间”,因此在夏令时期间会出错。 “东部时间(美国和加拿大)”会计算出您的DST是否为DST。 – jhiro009 2012-08-22 20:49:26

2

你的时区设置为美国东部时间。

您可以设置默认的时区到config/environment.rb

config.time_zone = "Eastern Time (US & Canada)" 

现在你拉出来的所有记录将在该时区。如果你需要不同的时区,比如基于用户时区,你可以在你的控制器中用before_filter来改变它。

class ApplicationController < ActionController::Base 

    before_filter :set_timezone 

    def set_timezone 
    Time.zone = current_user.time_zone 
    end 
end 

只要确保您将所有时间都存储在数据库中,并且UTC一切都会很好。

+2

我会避免'Time.zone = ..'因为它不是线程安全的。 – gertas 2010-12-08 15:48:07

+0

如果您正在运行像杂种,瘦客户或乘客这样的应用程序服务器,这会影响吗?他们运行多个实例,我认为单线程?我可能是错的,很想知道! – nitecoder 2010-12-12 22:40:12

+4

'Time.zone ='是线程安全的https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/time/zones.rb#L36-38。 – lest 2012-08-21 09:36:14

8

如果您添加到您的/config/application.rb

config.time_zone = 'Eastern Time (US & Canada)' 

然后你就可以细胞

Annotation.last.created_at.in_time_zone 

获得在指定的时区的时间。

14

虽然这是一个老问题,但值得一提的是。在previous reply建议使用before_filter临时设置时区。

你应该从来没有,永远这样做,因为Time.zone存储信息在线程中,它可能会泄漏到该线程处理的下一个请求。

相反,您应该使用around_filter以确保在请求完成后重置Time.zone。喜欢的东西:

around_filter :set_time_zone 

private 

def set_time_zone 
    old_time_zone = Time.zone 
    Time.zone = current_user.time_zone if logged_in? 
    yield 
ensure 
    Time.zone = old_time_zone 
end 

了解更多关于这个here

+0

现在有一个不错的[Time.use_zone](https://apidock.com/rails/Time/use_zone/class)方法。 – freemanoid 2017-09-04 19:41:46

2

如果您配置/config/application.rb

config.time_zone = 'Eastern Time (US & Canada)' 

Time.now.in_time_zone 

DateTime.now.in_time_zone 
相关问题