Javascript Bookshelf.js/Knex.js太“了”;“有用的”;使用UTC日期时间列
我有一个MySQL表,这个表有一个名为Javascript Bookshelf.js/Knex.js太“了”;“有用的”;使用UTC日期时间列,javascript,mysql,datetime,bookshelf.js,knex.js,Javascript,Mysql,Datetime,Bookshelf.js,Knex.js,我有一个MySQL表,这个表有一个名为DATETIME\u utc的DATETIME列。正如您所料,它是UTC中的日期和时间。在我的书架模型中,我定义了一个虚拟getter,它使用Moment.js将其转换为ISO 8601字符串格式。我的模型看起来像这样: bookshelf.plugin('virtuals'); exports.MyModel = bookshelf.Model.extend({ tableName : 'my_table', idAttribute :
DATETIME\u utc
的DATETIME
列。正如您所料,它是UTC中的日期和时间。在我的书架模型中,我定义了一个虚拟getter,它使用Moment.js将其转换为ISO 8601字符串格式。我的模型看起来像这样:
bookshelf.plugin('virtuals');
exports.MyModel = bookshelf.Model.extend({
tableName : 'my_table',
idAttribute : 'id',
virtuals : {
datetime_iso : {
get : function () {
return moment.utc(this.get('datetime_utc')).format();
}
}
}
});
问题是,当Bookshelf(或为其提供动力的底层Knex)看到DATETIME
列时,它会将该值包装在新日期(…)
中,然后将其交给我的代码。由于日期的值以UTC为单位,但日期构造函数假定该值位于服务器的本地非UTC时区,因此我最终得到了一个日期对象,该对象在错误的时区中具有正确的日期。一旦“时刻”在此日期开始工作,所有值都会在固定的小时数内关闭
我通过查找日期对象,并将日期组件直接分解为矩构造函数来解决这个问题。但感觉很恶心:
get : function () {
var dt = this.get('datetime_utc');
if (dt instanceof Date) {
dt = [
dt.getFullYear(), dt.getMonth(), dt.getDate(),
dt.getHours(), dt.getMinutes(), dt.getSeconds()
];
}
return moment.utc(dt).format();
}
有没有更干净的方法可以从Bookshelf获取未包装的
YYYY-MM-DD HH:MM:SS
字符串值,或者从忽略时区/将时区设置为UTC的日期创建新的矩对象?结果表明,这不是由Knex或Bookshelf引起的,而是由底层节点mysql库引起的。有一个名为时区
的连接属性,在解析为日期对象之前,它将被附加到每个日期
、日期
、时间戳
和新日期
值
Knex将在初始化时将此属性传递给节点mysql:
require('knex')({
"client": "mysql",
"connection": {
"host": "...",
"user": "...",
"password": "...",
"database": "...",
"timezone": "UTC" <-- This is the culprit
}
});
require('knex'))({
“客户端”:“mysql”,
“联系”:{
“主机”:“…”,
“用户”:“…”,
“密码”:“…”,
“数据库”:“…”,
“时区”:“UTC”嗨,你为此提交了问题吗?@Zhianc我目前没有。我仍然不确定这是一个合法的错误还是我误用了库。我实际上没有找到一个符合你所说的代码。但是插入时如何?我看到“whereend_stamp
='2016-01-31 16:12:58.615'”这是基于当前时区而不是UTC进行转换…这方面的想法?为了解决这个问题,您是添加了“时区”:“UTC”
还是删除了它?我遇到了同样的问题。要解决这个问题,您添加了“时区”:“UTC”。。。