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();
            
        
   );

我不确定您是否需要为 DATETIMETIMESTAMP 类型添加自定义解析。

【讨论】:

感谢@mikael,它肯定会帮助其他不想要默认格式的人。 Tihis 是一个更好的解决方案,我希望我的 mysql 的 DATE 类型为字符串,而 DATETIME 原样,我根据我的需要修改了答案,它就像一个魅力。【参考方案3】:

在我的例子中,连接是一个字符串,所以我必须找到日期 OID 并使用 pg.types.setTypeParser(DATE_OID, d => moment(d));

【讨论】:

以上是关于Knexjs 返回 mysql 时间戳、日期时间列作为 Javascript 日期对象的主要内容,如果未能解决你的问题,请参考以下文章

MySQL查询列值更改的时间戳

MySQL数据类型 - 日期和时间类型

如何将 SQL Server 的时间戳列转换为日期时间格式

将日期时间列值批量转换和更新为 UNIX 时间戳?

MySQL日期和时间戳的转换

MySQL日期和时间戳的转换