Во-первых, важно понимать, что материал часовых поясов рельсов в основном связан с презентацией. За кулисами все происходит в UTC.
Q1. На консоли Rails будет отображать время в вашем часовом поясе по умолчанию, поэтому Something.last.created_at
отображает эту временную метку в зоне, заданной Time.zone
Q2. Все они возвращают объект, который представляет «сейчас». Выбор даты и времени не зависит от часовых поясов. Если вам нужно, например, представлять время за пределами эпохи Unix, используйте DateTime. Разница между Time.now
и Time.zone.now
заключается в том, получите ли вы обратно экземпляр Time (который будет находиться в локальном часовом поясе сервера в качестве контроллера). Например, это контролирует то, что возвращает to_s
, но не то, какой момент времени представлен:
SomeModel.create(:time_attribute => Time.now)
SomeModel.create(:time_attribute => Time.zone.now)
вставит эту же строку в базу данных. Если вы просто отображаете время для пользователя (например, если ваш сайт отображает текущее время в заголовке), вам следует использовать Time.zone.now
, чтобы оно отображалось в правильном часовом поясе. Если вы просто храните его в БД, это не имеет значения - activerecord все равно преобразует его в TimeWithZone.
Q3. Методы сравнения в TimeWithZone
реализованы путем сравнения версии даты в формате utc, поэтому вы можете безопасно сравнивать время в разных зонах - вам не нужно преобразовывать их в какой-либо общий часовой пояс. Вы также можете сравнивать экземпляры TimeWithZone с обычными объектами времени.
Q4. Обычно вам не нужно ничего делать. Распространенным способом реализации этого является использование атрибута published_at
в вашей модели. Страницы, отображающие список статей, добавят
where('published_at <= ?', Time.now)
условие к запросу. Когда вы создаете свою статью, Rails берет дату из формы и преобразует ее в utc, поэтому в базе данных хранится версия utc этого published_at
времени. Сравнения не зависят от часового пояса, поэтому запрос работает независимо от часового пояса.
Это может усложниться из-за чистого времени суток (например, «4 часа дня»), потому что преобразование часового пояса может быть выполнено правильно только тогда, когда вы знаете дату (т.е. вы знаете точный момент времени), как в зависимости от летнего времени. (или политические события, такие как страны, меняющие свой часовой пояс) смещение от изменений UTC. В такой ситуации обычно требуется сохранять только время суток и преобразовывать его в полное время как можно позже, если вы знаете дату тоже.
В5. Rails всегда хранит UTC в базе данных. Прямым следствием этого является то, что изменение config.time_zone
не требует изменения данных, хранящихся в базе данных. Вы даже можете установить Time.zone
для каждого пользователя, чтобы пользователи видели время в своем часовом поясе - config.time_zone
просто контролирует значение по умолчанию Time.zone