Sequelize 将传递的日期对象转换为本地日期

Posted

技术标签:

【中文标题】Sequelize 将传递的日期对象转换为本地日期【英文标题】:Sequelize converts passed date object to local date 【发布时间】:2020-12-12 18:27:14 【问题描述】:

当我执行一个将数据作为替换传递的查询时,日期未在查询中设置为 UTC-Date。

我的代码:

let startInterval = moment('2020-12-09').toDate();

db.query(`
    SELECT kv.kpiId
    FROM kpiValues kv
    WHERE kv.insertDate >= :startInterval
`, 
    type: QueryTypes.SELECT,
    replacements: 
        startInterval: startInterval,
    
).catch(next)

打印 startInterval 变量会得到2020-12-08T23:00:00.000Z。 当我输出查询时,它会显示

SELECT kv.kpiId
FROM kpiValues kv
WHERE kv.insertDate >= '2020-12-09 00:00:00.000'

该列是续集日期列(SQL 日期时间)。查询中的值是我的本地时间 - 但数据库应该只使用 UTC 值 - 所以我希望它在查询中使用2020-12-08T23:00:00.000。我能做什么?

续集连接:

const sequelize = new Sequelize(dbName, dbUser, dbPassword, 
    host: Settings.dbUrl,
    port: dbPort,
    dialect: 'mariadb',
    dialectOptions: ,
    timezone: '+00:00',
    pool: 
        max: 70,
        min: 5,
        acquire: 30000
    ,
    define: 
        timestamps: false,
        freezeTableName: true
    ,
    logging: true // Remove property when all statements that are executed should be printed
);

【问题讨论】:

你使用什么 DBMS? @Anatoly mariaDB 在 MariaDB 日期时间中存储 as is 没有时区信息。见mariadb.com/kb/en/datetime/#time-zones @Anatoly 有什么可以做的吗? sequelize 不会在原始 SELECT 查询中处理这个问题吗?在 sequelize 插入和更新函数中,它自动使用 UTC 时间 你能把 UTC 日期时间作为字符串传递吗? 【参考方案1】:

由于 mariaDB 作为 DBMS 使用 sequelize 没有解决此问题的方法,因此以下解决方法有效: 只需手动将替换变量作为 UTC-String 传递:

dateVariable.toISOString()

【讨论】:

以上是关于Sequelize 将传递的日期对象转换为本地日期的主要内容,如果未能解决你的问题,请参考以下文章

将 UTC 纪元转换为本地日期

使用 sequelize 将 datetime 转换为 where 条件下的列的日期

将本地时间转换为 UTC 时间(日期时间对象)

谈谈javascript中的日期Date对象

将 mySQL 日期转换为 Javascript 日期

如何将 Moment.js 日期转换为用户本地时区?