我正在使用 Mongoose 模型保存我的记录,包括创建和更新的日期。这是我的模型架构:

var CasesModelSchema = new mongoose.Schema(
    {
        caseId: Number,
        sessionId: String,
        createdAt: {type: Date},
        updatedAt: {type: Date, default: Date.now},
        docs: mongoose.Schema.Types.Mixed
    },
    {
        collection: 'cases'
    }
);

我面临的问题是updatedAt字段将日期时间保存为utt中的ISODate("2017-04-24T12:40:48.193Z"),但是我服务器的时区是Asia/Calcutta。由于我需要根据服务器的时间进行查询,因此需要将日期时间保存在首选时区中。

这是我需要执行的查询(获取过去10天的所有数据)
var today = moment(moment().format('YYYY-MM-DD')).toDate();
var tenDaysDate = moment(moment().format('YYYY-MM-DD')).add(-10, 'days').toDate();

CasesModel.findOne({updatedAt: {$gte: tenDaysDate, $lt: today}},
    function(err, caseData){
    cl(caseData, __line);
});

我想要做的是查询以获取最近10天(从10天前午夜(Asia/Calcutta时区)到今天午夜(Asia/Calcutta时区)的所有更新记录。我怎么做?

最佳答案



如果在“今天的午夜”之前表示发生的上次午夜(在这种情况下,您不会立即获得结果),那么您可以使用类似这样的方法-使用您的本地时区:

// use moment-timezone to handle time zones correctly:
const moment = require('moment-timezone');

let end = moment().startOf('day').tz('UTC')
let start = end.subtract(10, 'days');

或明确使用Asia/Calcutta时区:
let end = moment.tz('Asia/Calcutta').startOf('day').tz('UTC');
let start = end.subtract(10, 'days');

如果在“今天的午夜”之前表示将要发生的下一个午夜(在这种情况下,您从一分钟前获得结果),那么您可以使用类似的方法-使用您的本地时区:
let end = moment().endOf('day').tz('UTC')
let start = end.subtract(10, 'days');

或明确使用Asia/Calcutta时区:
let end = moment.tz('Asia/Calcutta').endOf('day').tz('UTC');
let start = end.subtract(10, 'days');

您将拥有与本地午夜相对应的UTC日期,可以在Mongo查询中使用。

无需在Mongo中进行任何更改。

关于node.js - Mongoose 以UTC时间保存和检索日期,更改为服务器时区,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43590745/

10-10 01:25
查看更多