javascript - Bookshelf.js/Knex.js 太 "helpful"与 UTC DATETIME 列

标签 javascript mysql datetime bookshelf.js knex.js

我有一个 MySQL 表,这个表有一个名为 datetime_utcDATETIME 列。如您所料,它是 UTC 日期和时间。在我的 Bookshelf 模型中,我定义了一个虚拟 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 列时,它会将值包装在 new Date(...) 之前把它给我的代码。由于日期值采用 UTC,但 Date 构造函数假定该值位于服务器的本地非 UTC 时区,因此我最终得到一个 Date 对象,该对象在错误的时区具有正确的日期。一旦 Moment 在该日期开始工作,所有值都会相差固定的小时数。

我通过查找 Date 对象并将日期组件直接分解到 Moment 构造函数中来解决这个问题。但感觉很恶心:

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 字符串值,或者从 Date 中创建新 Moment 对象的速记时区被忽略/修改为 UTC?

最佳答案

事实证明,这不是由 Knex 或 Bookshelf 引起的,而是由底层的 node-mysql 库引起的。有一个名为 timezone 的连接属性将附加到每个 DATETIMEDATETIMESTAMPNEWDATE 在解析为 Date 对象之前的值。

Knex 将在初始化时将此属性传递给 node-mysql:

require('knex')({
    "client": "mysql",
    "connection": {
        "host": "...",
        "user": "...",
        "password": "...",
        "database": "...",
        "timezone": "UTC"    <-- This is the culprit
    }
});

关于javascript - Bookshelf.js/Knex.js 太 "helpful"与 UTC DATETIME 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25045691/

相关文章:

javascript - 输入文本框不能用 jQuery Draggable 编辑?

javascript - 无序列表中的列表项仅在 Internet Explorer 中重叠,在所有其他浏览器中一切正常

javascript - 如何在 JavaScript 中用小时解析字符串?

c# - 计算今天是否是即将到来的周年纪念日(基于某个开始日期)的最佳方法是什么?

javascript - 如何在 Sails.js v0.11 中触发自定义套接字事件?

php - 查询单选按钮到MYSQL数据库

php - 添加存储在数据库中的标题时,自动创建 slug

php - MySQL 变量字符串查询仅适用于数字而不适用于文本

javascript - 如何在 JavaScript 中将时间转换为十进制数?

javascript - 如何在非 Promise 函数中测试 Promise 回调?