【问题标题】:UTC DATE in Sequelize.jsSequelize.js 中的 UTC 日期
【发布时间】:2013-07-31 16:59:14
【问题描述】:

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

【问题讨论】:

  • 您找到解决方案了吗?我遇到了同样的问题,我找不到任何文档。
  • @JeffRyan 我不知道我下面的回答是不是太晚了,但如果你仍然有它,我希望它能解决你的问题(我希望不是!)=)

标签: node.js momentjs sequelize.js


【解决方案1】:

我遇到了同样的问题。 我已经这样解决了:

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)

希望对某人有所帮助.... :)

【讨论】:

  • 为什么是timezone: '+02:00'?不是要以UTC格式保存吗?
  • @DavidA 我收到警告说 useUTC 是一个无效选项
【解决方案2】:

我遇到了同样的问题,你用错了。 您应该使用 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()

【讨论】:

    【解决方案3】:

    我知道这已经很晚了,但这是为那些使用 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

    【讨论】:

      【解决方案4】:

      我的方式。

      转到节点模块中 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
              },
          },
          })
      

      【讨论】:

      • 我们需要一个可以做外部依赖(node_modules)的解决方案
      • 我已经编辑了我的解决方案并为永久解决方案添加了第二种方式@Poode
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-19
      • 2021-04-13
      • 2014-01-03
      • 2010-12-09
      • 2020-10-08
      • 2015-01-08
      • 2018-03-03
      相关资源
      最近更新 更多