所以当我设置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
我不知道我在这里缺少什么。
答案 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中显示日期的方法
我不知道我试图显示的记录来自计算机报告,当该计算机报告其抓取机器的当前时区时。
所以我试图把时间花在中央并再次转换它。糟糕。