Автор оригинала: Yitz Schaffer.
В Руби, момент времени, как правило, представлен как Время
объект. В твиттере, как Приложение, например, время каждого твита будет закодирован как А Время
Отказ Внутренние объекты этого типа представляют моменты вовремя как количество секунд с момента эпохи Unix (1 января 1970 года в полночь, UTC).
Использование Скоординированное универсальное время (UTC) дает нам стандарт для измерения времени против. Но, конечно, есть Задача пользовательского опыта, с которыми нам нужно иметь дело. Я использовал рельсы для создания WOODR, скелетной клон Twitter, чтобы проиллюстрировать точку. Вы можете играть в дому домой, клонируя репо И следуя инструкциям по установке в README.
Давайте посмотрим на временные шкарно-сгенерированные твиты … er, лает … Как показано, когда мы Git-checkout Наш первый коммит :
Контроллер
def index @barks = Bark.includes(:user).order('barked_at DESC').all end
Вид
<% @barks.each do |b| %>
Наш бедный пользователь придется мысленно преобразовать UTC в их местное время, чтобы иметь смысл даты каждой коры, предполагая, что они даже знают о том, что означает «UTC».
Что нам действительно нужно сделать, это локализовать Эти времена для пользователя. Хотя в рельсах можно сделать в рельсах, есть лучшее решение. Браузер уже осведомлен о часовой поясе пользователя! Библиотеки локализации боржеров в браузере работают наиболее естественно с помощью приложения, ориентированного на браузер, но все равно легко модернизировать на наших традиционных приложении Rails, чтобы преобразовать время UTC в местные времена.
Отказ от ответственности: Для ясности код в этих примерах является минимальным минимумом, необходимым для демонстрации этих методов; Там нет ошибок обработки.
Время локализации с моментом.
Для этого мы включаем момент .js в нашем проекте через MomentJs-Rails
GEM, объявляйте класс на каждой строке, который мы хотим преобразовать, и использовать момент для замены каждой строки. Проверьте Это совершается на Github Для получения полной информации.
$('.timestring').each(function() { this.textContent = moment(this.textContent).format('lll'); });
Тада! Сравните это с оригинальной версией выше.
lll
Формат Определяет читаемую человеческую форму даты на многообразности уровня 3, используя короткие слова, отсюда три строчные буквы «L».
Стандартизация пользовательского ввода в UTC
Флип-сторона заключается в том, что нам нужно преобразовать пользовательский ввод (предположительно локальное время) в UTC для хранения. Давайте снова будем использовать момент для этого. Ради примера, давайте предположим, что пользователь может указать время коры (на это фиксацию ):
Когда мы отправляем эту форму, время хранится в базе данных, как если бы пользователь ввел его в UTC: Ср, 03 февраля 2016 12:00:00 UTC +00: 00
Нам нужно конвертировать в соответствии с нашим предположением, что пользователь ввел в местное время. С Это совершает , мы добавим скрытое поле в качестве «реального» коры, и используйте обработчик на событии «Отправить» нашей форме, чтобы захватить поставляемое пользователем значение, преобразуйте его и установите время UTC на скрытое поле.
Вид
Barked at <%= datetime_field_tag :raw_barked_at %> <%= f.hidden_field :barked_at %>
Javascript
$('.bark-form').submit(function() { var barkMoment = moment($('#raw_barked_at').val()); if (barkMoment.isValid()) { $('#bark_barked_at').val(barkMoment.toISOString()); } });
На этот раз база данных имеет: Ср, 03 февраля 2016 17:00:00 UTC +00: 00
Бинго!
Бонус: локальный язык и формат
Moment.js также имеет дополнительную поддержку полностью локализации времени с языками и форматами; Все, что вам нужно сделать, это Требуется каждый момент .js locale, который вы хотите сделать доступным Отказ
Резюме
С библиотекой, такими как Moment.js, легко преобразовать системное время на то, что пользователь будет полностью поймет, а также хранить поставляемое пользователем времена единым способом.