2017-04-24 372 views
1

我使用猫鼬模型来保存我的记录,包括创建日期和更新日期。这里是我的模型模式:Mongoose使用UTC时间保存和检索日期,更改为服务器时区

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场保存日期时间为ISODate("2017-04-24T12:40:48.193Z"),这是UTC的,但我的服务器的时区为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 days ago午夜(Asia/Calcutta时区)至今天午夜(Asia/Calcutta时区)。我怎么做?

回答

2

我想要做的是在10天前的午夜(亚洲/加尔各答时区)到今天的午夜(亚洲/加尔各答时区)过去10天内获取所有更新记录的查询。我怎么做?

如果“今天的午夜”你的意思是最后午夜发生(在这种情况下,你不会得到前一时刻的结果),那么你可以使用这样的事情 - 用您的本地时间区:

// 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'); 

或明确使用亚洲/加尔各答时区:

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

如果“今天的midnigh T”你的意思是下一个半夜会发生(在这种情况下,你获得从刚才的结果),那么你可以使用这样的事情 - 用你的本地时区:

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

或明确使用亚洲/加尔各答时区:

let end = moment.tz('Asia/Calcutta').endOf('day').tz('UTC'); 
let start = end.subtract(10, 'days'); 

你将有符合您的本地午夜UTC日期,准备在蒙戈查询使用。

无需在Mongo中更改任何内容。

+0

感谢您的回答。我知道在数据库中存储时区中性时间是正确和可扩展的方法,但就我的知识而言,您能告诉我如何将我的本地时区保存在dB中? – gaganshera

+0

@gaganshera Mongo中没有时区支持。看到这个Jira票:https://jira.mongodb.org/browse/SERVER-6310 – rsp

相关问题