Arhn - архитектура программирования

Как я могу установить время в postgres, чтобы проверить поведение часового пояса с помощью RSpec?

Я хочу иметь возможность протестировать поведение компонента планировщика в разных часовых поясах. Однако функциональность для запуска запланированного поведения использует запросы на основе времени в postgres:

e.g.

# find reminders which have not been sent for "today" in the local date
Schedule.where('evening_reminder_last_sent_on_local_date != 
                                     DATE( NOW() AT TIME ZONE time_zone )')

Я хотел бы иметь возможность протестировать это поведение в RSpec и убедиться, что оно правильно воспроизводится в течение дня, и что если я отправлю японскому пользователю напоминание в 1:00 по всемирному координированному времени 25 декабря, то в 22:00 по всемирному координированному времени его напоминание на сегодня покажет up as не отправлено (поскольку в Японии около 7 утра следующего дня).

Однако для этого мне нужно установить дату и время в postgres. Это возможно?

Обратите внимание... речь не идет о сокращении времени Rails.

Задача не в том, чтобы остановить время в Rails — я знаю, как это сделать. Проблема в том, как установить время в Postgres.


Ответы:


1

Postgres использует настройку даты/времени базовой ОС (по крайней мере, в UNIX-подобных системах). Чтобы установить различные метки времени, вам нужно будет установить время ОС с помощью команды date.

Я бы, конечно, не рекомендовал это в системе, которая делает что-то еще важное. cronjobs может работать с перебоями и другими неприятными побочными эффектами.

Вместо этого замените функцию now() определяемой пользователем серверной функцией, например:

CREATE OR REPLACE FUNCTION now_test()
  RETURNS timestamptz AS $func$SELECT '2013-12-01 12:34'::timestamptz$func$ LANGUAGE SQL;

(Приведенное выше приведение предполагает текущую настройку часового пояса сеанса. В качестве альтернативы вы можете указать часовой пояс или смещение времени с литералом.)
Затем вы можете протестировать свой код с помощью:

Schedule.where('evening_reminder_last_sent_on_local_date != 
                             DATE(now_test() AT TIME ZONE time_zone)')

Измените приведенную выше функцию SQL с различными временными метками, и все готово.

01.12.2013
  • Это отличное, очень хорошее предложение. Однако у меня возникает еще один вопрос: как управлять функциями postgres в Rails. Я задал это как отдельный вопрос и хотел бы узнать ваши мысли - stackoverflow.com/questions/20314724/ 01.12.2013
  • @ErwinBrandstetter не беспокойтесь :) 19.05.2016

  • 2

    Предыдущее предложение действительно очень хорошее, но поскольку я хотел легко протестировать свой запрос с помощью драгоценного камня Delorean, я придумал с этим обходным путем:

    Schedule.where('evening_reminder_last_sent_on_local_date != 
                   DATE( ?::timestamp AT TIME ZONE time_zone )', Time.now)
    

    Я взял предыдущий пример просто так, но мне пришлось манипулировать временем в Postgres с помощью функции now(). Я не мог просто ввести свое рубиновое время, не применяя его с помощью ::timestamp.

    Более того, в вашем случае, возможно, вы могли бы использовать timestamptz.

    18.10.2014
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..