Time.zone& in_time_zone在视图中显示错误的时间

时间:2012-08-14 02:32:43

标签: ruby-on-rails ruby time

所以当我设置Time.zone时,我的视图中的日期会得到一些不一致的结果。我希望有人能告诉我发生了什么。我在ubuntu服务器12.04上运行的rails应用程序上有ruby。

在我的应用程序控制器中,我有一个before_filter设置来自current_user公司的time_zone记录的Time.zone。

before_filter :set_user_time_zone

private

def set_user_time_zone
  Time.zone = current_user.company.time_zone if user_signed_in?
end

我正在测试的用户位于“中部时间(美国和加拿大)”

原始数据库记录是2012-08-13 20:10:54

在我看来,我使用以下代码格式化日期:

servicedata.service_last_run_time.strftime('%b %e, %Y %l:%M%P')

我希望返回“2012年8月13日晚上8:10”,这将是“中部时间(美国和加拿大)”的上述记录,但我得到“2012年8月13日上午9:10”

我在rails控制台中测试了相同的代码,它运行正常。我不确定它为什么不起作用。

在我找到before_filter的想法之前,我只是在所有视图中链接“in_time_zone”,但获得了相同的结果。实施例

servicedata.service_last_run_time.in_time_zone(current_user.company.time_zone).strftime('%b %e, %Y %l:%M%P') 

同样,Time.zone或将in_time_zone手动链接到日期对象上都可以在rails控制台中正常工作,但在视图中会返回一个可怕的错误时间。

我测试了服务器是时候确保他们的UTC保持不变:

Rails Console : 2012-08-14 02:06:29 +0000
Ubuntu Shell: Tue Aug 14 02:06:38 UTC 2012

我不知道我在这里缺少什么。

2 个答案:

答案 0 :(得分:0)

您想使用I18n.localize - 请参阅http://guides.rubyonrails.org/i18n.html,特别是 - http://guides.rubyonrails.org/i18n.html#adding-date-time-formats

在config / locals / en.yml中有一些你可以使用的内置格式,你也可以添加自己的格式,所以你可以做到

<%= I18n.localize(servicedata.service_last_run_time, :format => :long) %>

您可以在配置中添加自己的,只需使用格式为arg的新定义的密钥

<%= I18n.localize(servicedata.service_last_run_time, :format => :my_super_special_format) %>

请注意,您可以使用这4种不同的方式编写,当您处于rails视图时它们都是相同的

<%= I18n.localize(servicedata.service_last_run_time, :format => :long) %>
<%= I18n.l(servicedata.service_last_run_time, :format => :long) %>
<%= localize(servicedata.service_last_run_time, :format => :long) %>
<%= l(servicedata.service_last_run_time, :format => :long) %>

如果datetime值为nil,则会抛出异常(不幸),所以如果nil有效则添加一些条件

<%= localize(servicedata.service_last_run_time, :format => :long) if servicedata.service_last_run_time %>

答案 1 :(得分:0)

我弄清楚了什么是错的。这不是我在time_zone中显示日期的方法

我不知道我试图显示的记录来自计算机报告,当该计算机报告其抓取机器的当前时区时。

所以我试图把时间花在中央并再次转换它。糟糕。