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



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

在我的应用程序控制器中,我有一个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')
我希望返回"Aug 13, 2012 8:10pm",

这将是"中部时间(美国和加拿大)"的上述记录,但是我得到"Aug 13, 2012 9:10am"

我在 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

我不知道我在这里错过了什么。

你想

使用 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) %>

如果日期时间值为 nil,它将抛出异常(不幸),因此如果 nil 有效,请添加一些条件

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

我找出了问题所在。这不是我在time_zone中显示日期的方法

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

所以我试图花点时间已经在中央,然后再次转换它。 哎呀。

最新更新