Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Bookshelf.js/Knex.js太“了”;“有用的”;使用UTC日期时间列_Javascript_Mysql_Datetime_Bookshelf.js_Knex.js - Fatal编程技术网

Javascript Bookshelf.js/Knex.js太“了”;“有用的”;使用UTC日期时间列

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 :

我有一个MySQL表,这个表有一个名为
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我目前没有。我仍然不确定这是一个合法的错误还是我误用了库。我实际上没有找到一个符合你所说的代码。但是插入时如何?我看到“where
end_stamp
='2016-01-31 16:12:58.615'”这是基于当前时区而不是UTC进行转换…这方面的想法?为了解决这个问题,您是添加了
“时区”:“UTC”
还是删除了它?我遇到了同样的问题。要解决这个问题,您添加了“时区”:“UTC”。。。