Как я могу отображать правильное время создания и изменения в моем веб-приложении? - PullRequest
1 голос
/ 03 февраля 2010

Я работаю над приложением Rails, которое похоже на блог. Пользователи создают записи. Я пытаюсь понять, как обрабатывать время хранения и отображения. Я прочитал эту запись о поддержке часовых поясов в Rails.

Это здорово, но не охватывает то, что нужно делать моему приложению. Он только смотрит на случаи, когда вы хотите преобразовать сохраненное время в текущий зарегистрированный часовой пояс пользователя. Напротив, эффект, который я хочу, это ...

  • Пользователь создает запись в Калифорнии в 10:00 утра.

  • Пару лет спустя он переезжает в Нью-Йорк, а затем в какой-то момент смотрит на свою старую запись. Дата «создания» должна указывать «10:00 утра». Ему нет дела до часовых поясов. Он просто хочет знать, в какое время дня он чувствовал себя, когда писал эту запись.

  • Если он затем редактирует Заявку в Нью-Йорке, отображаемая «измененная» дата, опять же, является его субъективным временем суток, когда он произвел редактирование. (Давайте предположим, что он перешел в «настройки» и изменил настройку часового пояса при переезде.)

  • Кроме того, ради тщательности приложение должно иметь возможность сообщать «реальное» абсолютное время при создании или обновлении записи.

(Примечание: мой воображаемый пользователь - парень, но для женщин он должен работать примерно так же.)

Я думаю о том, как реализовать это ...

  • Имеют атрибуты User#time_zone, Entry#created_at_utc и Entry#updated_at_utc в дополнение к стандартным created_at и updated_at.

  • Пользователь выбирает свой часовой пояс из меню при регистрации. (Они могут изменить его позже, если захотят.)

  • Приложение использует User#time_zone для хранения created_at и updated_at в субъективном местном времени пользователя. Если для них 10:00 утра, приложение пишет «10:00 утра». в БД.

  • Приложение также сохраняет текущее время UTC в вышеупомянутых полях _utc, чтобы справиться с последним вышеуказанным требованием.

Это хороший способ сделать это? Есть ли лучший способ?

Ответы [ 2 ]

2 голосов
/ 03 февраля 2010

Вы можете выбрать две дороги:

  1. Сохранение часового пояса (UTC) в учетной записи пользователя и в каждом сообщении - обновляйте часовой пояс сообщения вместе с полем updated_at всякий раз, когда пользователь изменяет сообщение (если он или она изменили часовые пояса).
  2. Хранить часовой пояс только в учетной записи пользователя. Когда пользователь меняет часовые пояса, обновляйте каждый пост, принадлежащий ему, и добавляйте / вычитайте даты create_at / updated_at.

Первый вариант кажется самым чистым вариантом. Для этого вам нужно всего лишь создать новый метод в вашей записи:

def locational_updated_at
  updated_at + timezone.seconds
end

Где часовой пояс - это целое число, содержащее секунды с UTC.

1 голос
/ 03 февраля 2010

Если вы можете, вы должны избегать хранения двух разных наборов временных меток, и вы должны избегать хранения любых не-UTC дат.Обе эти вещи приведут к путанице.Я не совсем уверен, что понимаю, что вы делаете (хотя мне нравится ваша идея субъективного времени), но не будет ли достаточно просто прикрепить часовой пояс к каждому сообщению и всегда использовать эту зону для отображения времени?По умолчанию используется часовой пояс, установленный в учетной записи автора, поэтому он может изменить его, когда переезжает по пересеченной местности, не затрагивая предыдущие сообщения.сообщение.Этого достаточно?Или я пропускаю какую-то часть этого?

...