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
helper
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
Теперь создайте функцию JavaScript, которая выполняется при загрузке DOM и будет выбирать все теги HTML с атрибутом data-time
.Зациклите их и обновите значение внутри тега 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, доступных с простым поиском.Вот несколько возможных решений