sách gpt4 ăn đã đi

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

In lại Tác giả: IT Lão Cao 更新时间:2023-10-29 00:06:47 29 4
mua khóa gpt4 giày nike

我有一个 MySQL 表,这个表有一个名为 datetime_utc của NGÀY GIỜ 列。如您所料,它是 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)看到 NGÀY GIỜ 列时,它会将值包装在 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?

câu trả lời hay nhất

事实证明,这不是由 Knex 或 Bookshelf 引起的,而是由底层的 node-mysql 库引起的。有一个名为 timezone 的连接属性将附加到每个 NGÀY GIỜNGÀYDẤU THỜI GIANNEWDATE 在解析为 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/

29 4 0
Cựu chiến binh CNTT
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress