我正在使用rails 3.0.5并且我已经在UTC中存储了created_at和updated_at.现在我想在用户的时区中显示created_at时间.我相信可以从浏览器中选择用户的时区,然后将时间转换为用户的时区.
我确信rails会有一个gem /插件来处理这样的事情.有东西吗?
Sim*_*tti 53
默认情况下,Rails会在将值存储到数据库之前将每个日期转换为UTC.这意味着,无论服务器时区如何,您的数据库中始终都有UTC日期.
为了将日期转换为用户的时区,您基本上有两种可能性:
如果您的站点允许注册,则可以将用户时区存储为用户首选项.在用户表中,存储用户时区.然后创建一个自定义帮助程序,您可以使用该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.它非常适合用户未登录且缓存友好的应用程序.
您可以将其添加到应用程序控制器,以将所有时间转换为用户的时区:
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)
您只需要捕获用户的时区
| 归档时间: |
|
| 查看次数: |
29884 次 |
| 最近记录: |