Модуль Node's Postgres pg возвращает неверную дату

Я объявил столбец даты в Postgres как дату.

Когда я записываю значение с помощью модуля pg узла, Postgres Tool pgAdmin отображает его правильно.

Когда я читаю значение обратно, используя pg, вместо простой даты, строка даты-времени приходит с неправильным днем.

например:

Date inserted:              1975-05-11
Date displayed by pgAdmin:  1975-05-11
Date returned by node's pg: 1975-05-10T23:00:00.000Z

Могу ли я предотвратить использование pg узла для применения часового пояса к данным только по дате? Это предназначено для дня рождения, и их часовой пояс не имеет никакого отношения здесь.

3 ответа

Решение

РЕДАКТИРОВАТЬ ответ на вопрос от разработчика на github

Команда node-postgres давно решила преобразовать даты и даты без часовых поясов в местное время при их извлечении. Это согласуется с некоторыми документами, которые мы выкопали в прошлом. Если вы будете искать здесь старые проблемы, вы найдете обсуждения.

Хорошая новость заключается в том, что это легко переоценить это поведение и вернуть даты, как вы считаете нужным.

Документация о том, как это сделать, доступна здесь: https://github.com/brianc/node-pg-types

Возможно, где-то даже есть модуль, который преобразует даты из postgres в любой часовой пояс, который вы хотите (я полагаю, utc). И если нет... это хорошая возможность написать один и поделиться со всеми!

Исходное сообщение Похоже, это проблема в pg-модуле. Я новичок в JS и нод, так что это только моя интерпретация.

При анализе дат (без временной части) предполагается местное время. пг \node_modules\ пг-типа \ Lib\textParsers.js

if(!match) {
    dateMatcher = /^(\d{1,})-(\d{2})-(\d{2})$/;
    match = dateMatcher.test(isoDate);
    if(!match) {
      return null;
    } else {
      //it is a date in YYYY-MM-DD format
      //add time portion to force js to parse as local time
      return new Date(isoDate + ' 00:00:00');

Но когда объект даты JS конвертируется обратно в строку getTimezoneOffset применены. pg\lib\utils.js s. function dateToString(date)

Просто переопределите парсер node-postgres для даты типа ( 1082) и вернуть значение без разбора:

      import pg from pg

pg.types.setTypeParser(1082, value => value)

Другой вариант - изменить тип данных столбца:

Сделать это можно, выполнив команду:

ALTER TABLE table_name
ALTER COLUMN column_name_1 [SET DATA] TYPE new_data_type,
ALTER COLUMN column_name_2 [SET DATA] TYPE new_data_type,
...;

как описано здесь.

У меня такая же проблема, я изменил на text.

Другие вопросы по тегам