Postgresql разница в дате в таблице и в Интернете - PullRequest
0 голосов
/ 21 сентября 2018

У меня странная ситуация со значением даты в моей базе данных PostgreSQL.

На моем веб-сайте есть календарь для выбора даты, и когда я выбираю какую-либо будущую дату, например "2018-09-23" в столбце таблицы PostgreSQL, она сохраняется как"2018-09-22 22:00:00"?

Очевидно, я что-то упустил.На веб-сайте все время показывается нормальное время "2018-09-23", но за столом это минус один день, как вы видите выше.Почему?

Rails console  params value sent to server

Web site calendar selected value

DB saved value with one day minus ROW 2 (id 82)

1 Ответ

0 голосов
/ 21 сентября 2018

Rails хранит поля DateTime в UTC, но не помечает их часовой пояс как UTC.Это соответствует типу timestamp without time zone в postgres.Поэтому, если ваш часовой пояс равен +2, он будет хранить время как UTC (+0).

В Rails Time.zone вернет текущий местный часовой пояс (вы можете добавить логику, чтобы изменить это пользователем, например).При сохранении даты и времени Rails автоматически преобразует текущий часовой пояс в UTC.Однако он не использует тип Postgres, который на самом деле включает данные о часовом поясе, поэтому он полагается на соглашение о преобразовании туда и обратно в часовой пояс пользователя.

Если вы действительно заботитесь только о дате, используйтетип даты в вашей миграции вместо Timestamp или DateTime.

Времена и даты имеют множество тонких причуд, и «правильное» поведение зависит от вашего варианта использования.В некоторых приложениях вам нужно иметь дело с «местным» временем при рассмотрении переходов даты, а иногда вам нужно изощрять логику вашего приложения или базы данных, чтобы думать в терминах местного времени, а иногда вам небезразлично время UTC.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...