Репликация Rails часового пояса "магия" в Postgres - PullRequest
0 голосов
/ 07 ноября 2018

Есть ли способ, которым я могу заставить Postgres (я использую Navicat, но продемонстрирую через инструмент командной строки) вести себя так же, как Rails, когда дело доходит до часовых поясов и UTC?

Rails, кажется, совершает магию, которая заставляет Postgres вести себя в UTC-стиле; тогда как через командную строку (или Navicat) он использует системный часовой пояс. Это сбивает с толку, потому что результаты зависят от того, выполняю ли я запрос в Ruby / Rails или в консоли.

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

Вот один пример (различные выходные значения):

-- in postgress:
# select ('2018-11-06' at time zone 'utc')::timestamptz;
        timezone
------------------------
 2018-11-06 08:00:00-08
(1 row)

-- in rails console
> ApplicationRecord.execute("select ('2018-11-06' at time zone 'utc')::timestamptz").first
   (0.5ms)  select ('2018-11-06' at time zone 'utc')::timestamptz
=> #<OpenStruct timezone="2018-11-06 00:00:00+00">

Они оба отформатированы по-разному (-00 против -08) и, что еще более запутанно, они возвращают фактическое разное время.

Пример Postgres возвращает результат за 16 часов до Rails!

enter image description here

1 Ответ

0 голосов
/ 07 ноября 2018

В моем понимании, это не магия Rails, но Rails просто использует UTC по умолчанию.И именно поэтому Rails может и действительно использует timezone вместо timezonetz или что-то в качестве типа базы данных по умолчанию для created_at и т. Д.

Вы можете изменить часовой пояс по умолчанию Rails следующим образом, если хотите (см. официальный справочник ):

# application.rb:
class Application < Rails::Application
  config.time_zone = 'Eastern Time (US & Canada)'
end

Что касается PostgreSQL, ваш результат , а не впереди; кажется, что ваш часовой пояс по умолчанию равенгде-то на американском континенте (8 часов после UTC).Вы можете проверить это следующим образом:

postgres=> SET TIME ZONE 'America/New_York';
postgres=> select ('2018-11-06' at time zone 'UTC')::timestamptz;
        timezone        
------------------------
 2018-11-06 05:00:00-05
(1 row)

Я не знаю, что делает Navicat.Но, возможно, проверь свой postgresql.conf.Вы можете сбросить timezone на UTC, если хотите (и перезапустить сервер postgreSQL).См. этот ответ для "postgres default timezone" для получения дополнительной информации.

...