$(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
});
});
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
9条答案
按热度按时间yebdmbv41#
默认情况下,Rails会在将值存储到数据库之前将每个日期转换为UTC。这意味着,无论服务器时区如何,数据库中总是有UTC日期。
为了将日期转换为用户的时区,您基本上有两种可能性:
1.服务器端方法
1.客户端方法
服务端方式
如果您的网站允许注册,您可以将用户时区存储为用户首选项。在用户表中,存储用户时区。然后创建一个自定义助手,您可以使用
in_time_zone
方法将任何日期/时间格式化为正确的时区。字符串
你的助手可能看起来像
型
我通常也喜欢使用
I18n.l
助手输出标准格式型
客户端方式
如果您的网站没有注册,或者您不想询问用户的时区,或者您只是想使用用户系统时区,那么您可以使用JavaScript。
我的建议是创建一个自定义的helper,它每次都以适当的方式打印出来,这样您就可以创建一个通用的JavaScript函数来转换值。
型
现在,创建一个JavaScript函数,在DOM加载时执行,它将选择所有具有
data-time
属性的HTML标记。循环它们并使用给定时区的正确时间更新span
标记中的值。一个简单的jQuery示例是
型
我没有在这里发布完整的代码,因为有很多JavaScript时间格式化程序可以通过简单的搜索获得。
6vl6ewon2#
Basecamp有一个很好的gem,叫做local_time,用于客户端渲染-https://github.com/basecamp/local_time。它非常适合用户没有登录的应用程序,并且缓存友好。
jexiocij3#
您可以将其添加到您的应用程序控制器,以将所有时间转换为用户的时区:
字符串
您只需捕获用户的时区
gg0vcinb4#
假设您想要显示的值来自数据库,即
started_at
,并且(默认情况下)存储在UTC中。如果你有用户的时区作为偏移量,你也可以通过执行以下操作来本地化时间:
字符串
然后可以用各种方式混合以获得您想要的部件:
型
ocebsuys5#
http://api.rubyonrails.org/classes/Time.html#method-c-use_zone
这就是你要找的
字符串
k4aesqcs6#
如果您想将日期转换为特定时区:
字符串
这里的deadline是一个日期。
此外,您可以通过本地机器时区加上本地时间来查找世界时间,反之亦然,如在卡拉奇- +05:00,您可以简单地将其添加到世界时间中的值以查找您所在时区的时间,或者通过从您的本地时间减去时区差(在我们的情况下为05:00)来从您的本地时间中获取世界时间
p8ekf7hl7#
我的jquery是一个rusty,所以我花了一点时间来弄清楚如何实现上面接受的答案的客户端方法。
我的解决方案是:
超文本标记语言:
字符串
Jquery/JavaScript:
型
lztngnrs8#
你可能想看看这些链接除了一个本张贴:
34gzjxbg9#
在Rails 5.2及更高版本中有
.localtime
:字符串
(https://api.rubyonrails.org/classes/ActiveSupport/TimeWithZone.html#method-i-localtime)