我正在使用knexjs我以格式插入数据,YYYY-MM-DD HH:mm:ss例如2017-07-14 15:00:00,在获取数据时保存后,datetime列值将作为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'
}
});
Run Code Online (Sandbox Code Playgroud) 我在postgres数据库中有一个类型的列date.这是一个像生日这样的列,它只是一个日期,不需要有时间部分.
使用knex获取此列时,结果是一个javascript Date对象.它可能是这样做的new Date(row.birthday),这是发送给客户端的结果.
现在的问题是客户端收到的值是标准的ISO 8601格式,带有时间部分和Z.当客户端尝试从此字符串创建新的Date对象时,客户端可能具有基于客户端所在位置的错误日期值.
例如:
Date: 2018-06-15
Date sent to client: 2018-06-15T00:00:00Z
Client in +5:00 | Client in -5:00
2018-06-16 05:00:00 | 2018-05-15 10:00:00
Run Code Online (Sandbox Code Playgroud)
如果服务器是UTC,这很好,我们可以添加客户端的时区偏移并获取原始日期,但这感觉有点脆弱,并且在本地开发期间(不是UTC)中断.
一个简单的解决方案是将日期部分作为字符串发送给客户端.但这需要将日期存储varchar在服务器中,我们不想这样做.我们将丢失日期格式约束,并且将使用SQL进行基于日期的计算变得更加困难.
我们可以varchar在选择列时强制转换列,但是每次获取此表时我们都需要考虑这一点.这也意味着我们需要绕过ORM(Bookshelf)来处理这个表.
是否有一种简单的方法可以在knex或书架或postgres本身中指定列需要存储为date,具有所有附带的约束,但总是被提取为varchar?