Knexjs 返回 mysql 时间戳、日期时间列作为 Javascript 日期对象
Posted
技术标签:
【中文标题】Knexjs 返回 mysql 时间戳、日期时间列作为 Javascript 日期对象【英文标题】:Knexjs returning mysql timestamp, datetime columns as Javascript Date object 【发布时间】:2017-12-19 14:28:47 【问题描述】:我正在使用 knexjs,我以 YYYY-MM-DD HH:mm:ss
的格式插入数据,例如 2017-07-14 15:00:00
,并在获取数据时保存后,日期时间列值作为 javasript Date 对象返回。
我想以YYYY-MM-DD HH:mm:ss
的格式返回这些对象,但它以YYYY-MM-DDTHH:mm:ss.000Z
的格式返回,例如2017-06-23T06:44:44.000Z
。
我通过手动迭代和转换它们来返回它们。我想知道是否有另一种方法来做到这一点,比如在 mysql 驱动程序或 knexjs 配置中。目前我的 knexjs 配置是这样的。
var connection = require('knex')(
client: 'mysql',
connection:
host: db.host,
user: db.user,
password: db.password,
database: db.database,
timezone: 'UTC'
);
【问题讨论】:
【参考方案1】:用这个改变你的连接对象:
var connection = require('knex')(
client: 'mysql',
connection:
host: db.host,
user: db.user,
password: db.password,
database: db.database,
timezone: 'UTC',
dateStrings: true
);
【讨论】:
在这种情况下,dateStrings
选项确实是更好的选项,如果默认格式可以的话。 +1【参考方案2】:
这就是 mysql 驱动程序如何将从数据库读取的类型转换为 javascript (https://github.com/mysqljs/mysql#type-casting)
您可以通过添加typeCast
连接选项来覆盖默认转换:
var moment = require('moment');
var connection = require('knex')(
client: 'mysql',
connection:
host: db.host,
user: db.user,
password: db.password,
database: db.database,
timezone: 'UTC',
typeCast: function (field, next)
if (field.type == 'DATETIME')
return moment(field.string()).format('YYYY-MM-DD HH:mm:ss');
return next();
);
我不确定您是否需要为 DATETIME
或 TIMESTAMP
类型添加自定义解析。
【讨论】:
感谢@mikael,它肯定会帮助其他不想要默认格式的人。 Tihis 是一个更好的解决方案,我希望我的 mysql 的 DATE 类型为字符串,而 DATETIME 原样,我根据我的需要修改了答案,它就像一个魅力。【参考方案3】:在我的例子中,连接是一个字符串,所以我必须找到日期 OID 并使用
pg.types.setTypeParser(DATE_OID, d => moment(d));
【讨论】:
以上是关于Knexjs 返回 mysql 时间戳、日期时间列作为 Javascript 日期对象的主要内容,如果未能解决你的问题,请参考以下文章