Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何防止Sequelize将日期对象转换为本地时间_Node.js_Sequelize.js_Utc - Fatal编程技术网

Node.js 如何防止Sequelize将日期对象转换为本地时间

Node.js 如何防止Sequelize将日期对象转换为本地时间,node.js,sequelize.js,utc,Node.js,Sequelize.js,Utc,我正在用于一个节点项目。它连接到Postgres databsae,其中包含一个带有日期字段的表(与带有时区的时间戳不同,日期没有时间数据) 在代码中,我使用javascriptdate对象对日期进行建模,该对象将时间存储为UTC午夜。当我使用该Date对象将记录插入表中时,sequelize显然首先将其转换为本地时间,因为这些记录总是落后1天。因此,如果我想将2000-10-31插入到数据库中,我将得到2000-10-30。我在UTC-5 如何告诉sequelize在插入数据库之前不要将日期转

我正在用于一个节点项目。它连接到Postgres databsae,其中包含一个带有
日期
字段的表(与带有时区的
时间戳不同,
日期
没有时间数据)

在代码中,我使用javascript
date
对象对日期进行建模,该对象将时间存储为UTC午夜。当我使用该
Date
对象将记录插入表中时,sequelize显然首先将其转换为本地时间,因为这些记录总是落后1天。因此,如果我想将2000-10-31插入到数据库中,我将得到2000-10-30。我在UTC-5

如何告诉sequelize在插入数据库之前不要将日期转换为本地时间

下面是一些示例代码。如果您想自己运行,我还创建了一个

var Sequelize = require('sequelize');

const sequelize = new Sequelize('testdb', 'postgres', '???', {
    host: 'localhost',
    dialect: 'postgres'
});

TestTable = sequelize.define('date_test',
    {
        id: {
            primaryKey: true,
            type: Sequelize.INTEGER,
            autoIncrement: true
        },

        someDate: {
            field: 'some_date',
            type: Sequelize.DATEONLY
        }
    },
    {
        timestamps: false,
        freezeTableName: true
    }
);

// midnight UTC on Halloween The problem is that the date is created as UTC time, but because 
DATEONLY
has no awareness of the timezone, it formats the Date object "as is" (in local time) with format
YYYY-MM-DD
(using moment.js - see here in source).

For a
DATEONLY
you can just do this:

var date = new Date(2000, 9, 31);
var Sequelize=require('Sequelize');
const sequelize=new sequelize('testdb','postgres','?'{
主机:“localhost”,
方言:“postgres”
});
TestTable=sequelize.define('date\u test',
{
身份证:{
primaryKey:没错,
类型:Sequelize.INTEGER,
自动递增:真
},
某天:{
字段:'some_date',
类型:Sequelize.DATEONLY
}
},
{
时间戳:false,
冻结表名称:true
}
);

//万圣节午夜UTC问题在于日期被创建为UTC时间,但由于
DATEONLY
不知道时区,因此它使用格式
YYYY-MM-DD
(使用moment.js-)将日期对象格式化为“原样”(在本地时间)

对于
DATEONLY
,您可以执行以下操作:

这将正确插入日期

程序员很少这样说,但这一次你对时区想得太多了


旧的错误答案 这取决于您检查值的方式,但javascript和postgresql正在将其转换为本地时区进行显示

Sequelize对日期字段()使用带时区的时间戳

在报告中说:

对于带有时区的时间戳,内部存储的值始终以UTC(通用协调时间,传统上称为格林威治标准时间,GMT)为单位。指定了明确时区的输入值将使用该时区的适当偏移量转换为UTC。如果输入字符串中未说明时区,则假定它位于系统时区参数指示的时区中,并使用时区的偏移量转换为UTC

当输出带有时区值的时间戳时,它总是从UTC转换为当前时区,并在该时区中显示为本地时间。要查看另一时区中的时间,请更改时区或使用AT时区结构(见第9.9.3节)

如果要在postgresql中输出时间值,请尝试将其转换为UTC。如果要以javascript输出,请尝试
date.toutString()


你的破解看起来有效的原因是因为它们实际上存储的是
2000-11-01 05:00
,但当你检查值时,它会转换为你的本地时区。

Sequelize没有将日期字段创建为type
TIMESTAMP WITH TIMEZONE
,因为我没有使用
Sequelize.date
类型。我使用的是
Sequelize.DATEONLY
,它创建了一个postgres
DATE
字段,该字段没有时间数据。您如何检查表的值?在postgresql或javascript中?我在Postgre中查看它们如果您运行
从您的\u表中选择时区“GMT”处的\u date \u字段
它是否显示正确的日期?抱歉,我手边没有postgresql安装……它显示的是
2018-10-31 05:00:00
哪一个是正确的日期,但是由于postgres没有在日期字段中存储时间值,所以时间有意义吗?它看起来像是假设我的时间是午夜(UTC-5),然后通过增加5小时将其转换为UTC。