首页 文章

Sequelize.js中的UTC日期

提问于
浏览
6

我在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出来了?另外,有没有办法让它尝试转换为我的服务器时区?

3 回答

  • 1

    我知道这已经很晚了,但是对于那些与 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本身中返回服务器's timezone, which is wrong (unless it'中的日期)

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

  • 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)
    

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

  • 3

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

    看看当下的文档:http://momentjs.com/docs/#/parsing/utc/

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

相关问题