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
你的助手可能看起来像
def format_time(time, timezone)
time.in_time_zone(timezone)
end
我通常也喜欢使用 I18n.l 帮助器输出标准格式
def format_time(time, timezone)
I18n.l time.to_time.in_time_zone(timezone), format: :long
end
客户端方法
如果您的网站没有注册,或者您不想向用户询问他们的时区,或者您只是想使用用户系统时区,那么您可以使用 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
现在,创建一个在 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
});
});
我不会在这里发布完整的代码,因为有很多 JavaScript 时间格式化程序可以通过简单的搜索获得。以下是一些可能的解决方案