Knex returns DATETIME 字段应用我的机器时区的偏移量

Knex returns DATETIME fields applying offset of my machine timezone

我在数据库的时区 Europe/Madrid 中保存了以下行:

dateA = '2019-03-26 15:00:00'
dateB = '2019-03-26 14:00:00'

选择条目时:

let entry = this.query().findById(id)

我得到以下值 (console.log(entry)):

{ 
  dateA: 2019-03-26T06:00:00.000Z,
  dateB: 2019-03-26T05:00:00.000Z 
}

什么应用了这个转换?

我的环境:

我试过了:

在创建 knex 时设置连接时区:

const connection = {
  user: dbCreds.username,
  password: dbCreds.password,
  host: hostname,
  database: dbCreds.database,
  timezone: '-1:00'
}
const pool = knex({
  client: 'mysql2',
  connection,
  pool: {
    min: 2,
    max: 30
  }
})

我仍然得到相同的结果

终于知道是怎么回事了。

Knex,在检索日期时间字段的信息时检查数据库的时区。您可以使用以下方式检查它:

SELECT @@global.time_zone, @@session.time_zone;

我的情况是 returns SYSTEM SYSTEM。所以它使用我的机器时区。为了测试它,我将其更改为 UTC

所以现在,当读取以下值时:

dateA = '2019-03-26 15:00:00'
dateB = '2019-03-26 14:00:00'

Knex 假定其为 UTC,因此返回 UTC 中的值:

{ 
  dateA: 2019-03-26T15:00:00.000Z,
  dateB: 2019-03-26T14:00:00.000Z 
}

似乎无法将 MySQL 配置为使用 'Europe/Madrid' 作为默认时区。