Node的Postgres模块pg返回错误的日期

时间:2015-07-24 10:38:34

标签: node.js node.js-pg

我已在Postgres中将日期列声明为日期。

当我使用节点的pg模块写入值时,Postgres工具pgAdmin会正确显示它。

当我使用pg读取值时,而不是普通日期,日期时间字符串出现错误的一天。

e.g:

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应用仅限时区的数据吗?它适用于出生日期,ihmo时区与此无关。

2 个答案:

答案 0 :(得分:3)

编辑来自开发人员在github上的回复

node-postgres团队很久以前决定转换日期和日期时间 没有时区到当地时间拉出来。这是一致的 我们过去挖过一些文件。如果你扎根 通过旧问题,你可以找到讨论。

好消息是它很容易过度使用这种行为并返回 但是你认为合适的日期。

这里有关于如何执行此操作的文档: https://github.com/brianc/node-pg-types

甚至可能是一个可以转换日期的模块 postgres到你想要的任何时区(我猜测)。而如果 那不是......这是一个很好的机会来写一个&与大家分享!

原始消息 看起来这是pg-module中的一个问题。 我是JS和节点的初学者,所以这只是我的解释。

当解析日期(没有时间 - 部分)时,假设当地时间。 PG \ node_modules \ PG-类型\ 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。 function dateToString(date)

答案 1 :(得分:1)

另一个选择是更改列的数据类型:

您可以通过运行以下命令来完成此操作:

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,
...;

here所述。

我遇到同样的问题,我改为text