如何在用户的时区显示时间

Nic*_*ilt 39 ruby-on-rails

我正在使用rails 3.0.5并且我已经在UTC中存储了created_at和updated_at.现在我想在用户的时区中显示created_at时间.我相信可以从浏览器中选择用户的时区,然后将时间转换为用户的时区.

我确信rails会有一个gem /插件来处理这样的事情.有东西吗?

Sim*_*tti 53

默认情况下,Rails会在将值存储到数据库之前将每个日期转换为UTC.这意味着,无论服务器时区如何,您的数据库中始终都有UTC日期.

为了将日期转换为用户的时区,您基本上有两种可能性:

  1. 服务器端方法
  2. 客户端方法

服务器端方法

如果您的站点允许注册,则可以将用户时区存储为用户首选项.在用户表中,存储用户时区.然后创建一个自定义帮助程序,您可以使用该in_time_zone方法将任何日期/时间格式化为适当的时区.

> t = Time.current
# => Mon, 23 Dec 2013 18:25:55 UTC +00:00 
> t.zone
# => "UTC" 
> t.in_time_zone("CET")
# => Mon, 23 Dec 2013 19:25:55 CET +01:00 
Run Code Online (Sandbox Code Playgroud)

你的助手可能看起来像

def format_time(time, timezone)
  time.in_time_zone(timezone)
end
Run Code Online (Sandbox Code Playgroud)

我通常也喜欢使用I18n.l帮助器输出标准格式

def format_time(time, timezone)
  I18n.l time.to_time.in_time_zone(timezone), format: :long
end
Run Code Online (Sandbox Code Playgroud)

客户端方法

如果您的网站没有注册,或者您不想询问用户他们的时区,或者您只是想使用用户系统时区,那么您可以使用JavaScript.

我的建议是创建一个自定义帮助器,每次都以正确的方式打印出来,这样你就可以创建一个通用的JavaScript函数来转换值.

def format_time(time, timezone)
  time = time.to_time
  content_tag(:span, I18n.l(time, format: :long), data: { timezone: timezone, time: time.iso8601 })
end
Run Code Online (Sandbox Code Playgroud)

现在,创建一个在DOM加载时执行的JavaScript函数,该函数将选择具有data-time属性的所有HTML标记.循环它们并span使用给定时区中的适当时间更新标记内的值.

一个简单的jQuery示例

$(function() {
    $("span[data-time]").each(function() {
        // get the value from data-time and format according to data-timezone
        // write the content back into the span tag
    });
});
Run Code Online (Sandbox Code Playgroud)

我不会在这里发布完整的代码,因为有很多JavaScript时间格式器可以通过简单的搜索.这里有一些可能的解决方案


Str*_*ika 16

Basecamp有一个很好的宝石,名为local_time,用于客户端渲染 - https://github.com/basecamp/local_time.它非常适合用户未登录且缓存友好的应用程序.


Joh*_*gle 7

您可以将其添加到应用程序控制器,以将所有时间转换为用户的时区:

class ApplicationController < ActionController::Base

  around_filter :user_time_zone, :if => :current_user
  def user_time_zone(&block)
    Time.use_zone(current_user.timezone_name, &block)
  end
end
Run Code Online (Sandbox Code Playgroud)

您只需要捕获用户的时区


aNo*_*ble 0

除了 Ben 发布的链接之外,您可能还想看看这些链接: