Модуль 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
.