0

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

在我的应用程序控制器中,我有一个 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

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

4

2 回答 2

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 %>
于 2012-08-14T03:31:56.967 回答
0

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

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

所以我试图花时间在中央并再次转换它。哎呀。

于 2012-08-14T15:45:35.393 回答