【发布时间】:2019-04-22 00:37:12
【问题描述】:
this问题的第一个答案表明猫鼬在检索数据时会根据服务器时区调整日期。
但是我没有这种行为。
我将(节点)服务器时区设置为:
process.env.TZ='Europe/Paris'
例如,如果我创建一个简单的模型,例如:
const mongoose = require("mongoose");
const testSchema = new mongoose.Schema({
myDate: { type: Date, required: true },
}, { timestamps: true });
exports.Comment = mongoose.default.model('TestSchema', testSchema);
但是,如果我用2020-01-01 20:20:20 创建一个日期,那么在执行TestSchema.find() 时,日期将是:2020-01-01T19:20:20.000Z 所以有两件事我不明白:
- 欧洲/巴黎实际上是 UTC +2,所以我希望日期是 UTC 中的
2020-01-01T18:20:20.000Z或带有服务器时区的2020-01-01T20:20:20.000Z - 如何让猫鼬自动将日期设置为正确的时区?
我知道 myDate 是一个 Date 对象,所以我可以手动转换它,但我宁愿不必自己做,原因很简单,比如忘记转换应用程序中的日期之一或不必做每次添加一个 Date 字段时它
我能想到的一个简单的解决方案是为 mongoose 注册一个全局插件,该插件将使用 schema.set('toJSON', ... 和 schema.set('toObject', ...) 和 transform 方法,这样我就可以遍历 shema 字段,如果该字段是日期,则更新它到我的时区。
但我发现这种方法有两个问题:
- 如果我要查询很多文档,每个文档都有很多字段,这听起来不太好
- 如你所见here我目前无法注册全局插件...
以服务器时区格式获取日期的最佳方法是什么?我宁愿仍然将它们存储在 UTC 中,但根据服务器时区设置小时。
编辑:
我刚刚看到虽然console.log(myDate) 输出2018-01-01T19:20:20.000Z console.log(myDate.toString() 输出Mon Jan 01 2018 20:20:20 GMT+0100 (Central European Standard Time) 所以它似乎可以使用,即使我宁愿仍然有一个Date 对象并将其转换为字符串在将其发送给客户端之前(需要一些格式,因为这种格式不是非常用户友好)。但是话又说回来,我将如何在全球范围内而不是在每个日期都这样做
【问题讨论】:
标签: node.js mongodb datetime mongoose timezone