Sequelize.js中的UTC日期

时间:2013-07-31 16:59:14

标签: node.js momentjs sequelize.js

我在node.js中使用Sequelize来保存打开和关闭时间。我也使用moment.js来格式化。改变FindOrCreate我这样做:

result.open = moment(hours.open, "hh:mma").format("YYYY-MM-DD HH:mm:ss");
result.save()
...

这很好用,时间格式化为MySQL的日期时间格式。问题是当我检索时间时Seqquelize认为它是UTC时间并将其转换为EST(我的服务器时区)。

我更希望它以UTC身​​份进入数据库并以相同的方式出现。有什么我做错了吗?为什么Sequelize在插入时不将其转换为UTC,但假设它的UTC出来了?另外,有没有办法让它尝试转换为我的服务器时区?

4 个答案:

答案 0 :(得分:5)

我知道这已经很晚了,但是对于那些与 postgres 挣扎的人来说(也许这可以为你指出其他引擎的正确方向)

如您所知,postgres以UTC格式存储日期时间。

对我来说,这个问题原来不是在Sequelize中,而是在pg包中。

要修复它,请将其放在sequelize = new Sequelize()

之前
var types = require('pg').types;
var timestampOID = 1114;
types.setTypeParser(1114, function(stringValue) {
  return new Date( Date.parse(stringValue + "0000") );
});

我认为,问题是pg包正在执行new Date(stringValue),它会在服务器的时区中返回日期,这是错误的(除非它在utc本身中)

有关详细信息,请参阅此主题: https://github.com/brianc/node-postgres/issues/429

答案 1 :(得分:4)

我遇到了同样的问题。 我已经修好了这个:

config/sequelize.js

const sequelize = new Sequelize(database, user, password, {
host,
dialect: 'mysql',
port,
operatorsAliases,
dialectOptions: {
    useUTC: true, // -->Add this line. for reading from database
},
timezone: '+02:00', // -->Add this line. for writing to database
pool: {
    max: 10,
    min: 0,
    idle: 10000,
},
logging: console.log,
// define: {},
})

momentJS(UTC):

const ACCEPT_FORMAT = 'YYYY-MM-DD hh:mm:ss'
const { start_date, end_date } = req.params
const start = moment.utc(start_date, ACCEPT_FORMAT)
const end = moment.utc(end_date, ACCEPT_FORMAT)
console.log(start)
console.log(end)

希望它会帮助某人.... :)

答案 2 :(得分:1)

我遇到了同样的问题,你错了。 您应该使用moment.utc而不是moment

请查看文档:{​​{3}}

result.open = moment.utc(hours.open, "hh:mma").format("YYYY-MM-DD HH:mm:ss");
result.save()

答案 3 :(得分:0)

就是这样。

转到节点模块中mssql的数据类型

...\node_modules\sequelize\lib\dialects\mssql\data-types.js

然后像这样将您的 DateType 值修改为您当前的 utc

 class DATEONLY extends BaseTypes.DATEONLY {
    static parse(value) {
      return moment.utc(value).format('YYYY-MM-DD');
    }
  }

第二种方式(推荐)。

您可以在 Sequelize 连接中添加 useUTC 属性

const sequelize = new Sequelize({
    ......
    dialectOptions: {
        encrypt: false ,
        options: {
          useUTC: false, // for reading from database
          requestTimeout: 90000
        },
    },
    })