2017-05-10 76 views
0

Mongodb以UTC存儲日期對象。我需要根據「今天」查詢客戶端輸入的任務。今天不同,從用戶的角度來看,誰可以在東部時區或太平洋。這是我遇到的問題:根據客戶端日期查詢mongodb日期

記錄輸入爲「2017-05-10 15:15:11.283Z」。當我晚上晚些時候查詢服務器時,服務器日期已經是2017-05-11,但從客戶的角度來看,它仍然是2015-05-10。

我需要找到客戶端輸入的所有任務「today」。

我嘗試這樣做:

let start = new Date(); 
 
start.setHours(0,0,0,0); 
 

 
let end = new Date(); 
 
end.setHours(23,59,59,999);

不過,雖然白天(當日)的作品,它沒有顯示記錄時,客戶端查詢到了晚上,但在午夜之前。

基於下面的意見和我自己的頭腦風暴,我現在傳遞客戶端日期到服務器上,並轉換爲UTC,像這樣:

let clientDate = req.params.month +'/'+ req.params.date +'/'+ req.params.year; //'5/10/2017' 
 
console.log('clientDate ' + clientDate); 
 

 
let start = new Date(clientDate); 
 
start.setHours(0,0,0,0); 
 
start = convertDateToUTC(start); 
 

 
let end = new Date(clientDate); 
 
end.setDate(end.getDate() + 1); //need this, otherwise queries next day 
 
end.setHours(0,0,0,0); 
 
end = convertDateToUTC(end); 
 

 
console.log('start ' + start +' end ' + end); 
 
      
 
return Taks.find({goalId: {$in: goalIds}, createdAt: {$gte: start, $lt: end}}).lean() //only today 
 

 

 
//using function found on stack overflow 
 
function convertDateToUTC(date) { 
 
    return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds()); 
 
}

它正常工作,它只是似乎很難提供客戶端的日期到服務器。

+1

您應該通過客戶端時區並考慮到查詢 –

+1

您是否轉換爲UTC? – thedarkcoder

回答

0

如果我理解正確,日期將存儲在時區偏移+00:00的數據庫字符串中。您希望在客戶端的時區(無論可能是什麼)獲取「today」的開始和結束日期對象。

以下假設(可能是不正確的),在req.params值是UTC,但被視爲本地主機系統上做了處理:

let clientDate = req.params.month +'/'+ req.params.date +'/'+ req.params.year; //'5/10/2017' 
console.log('clientDate ' + clientDate); 

let start = new Date(clientDate); 

這就是爲什麼你的日期在時區偏移之外,你必須將它們移回去。

您不應該創建一個字符串,然後將其留給Date構造函數來解析它。直接將值賦給Date構造函數。

接下來,你似乎想創造的開始和當地的一天,UTC日期落在結束日期,所以下面應該這樣做:

var req = { 
 
    params: { 
 
    year: '2017', 
 
    month: '5', 
 
    date: '10' 
 
    } 
 
}; 
 

 
// No parsing, treat date values as UTC 
 
var clientDate = new Date(Date.UTC(req.params.year, req.params.month - 1, req.params.date)); 
 

 
// Copy date 
 
var start = new Date(clientDate); 
 

 
// Set to local start of day 
 
start.setHours(0,0,0,0); 
 

 
// Copy start to end and add 24 hours 
 
var end = new Date(start); 
 

 
// Adjusting UTC hours avoids daylight saving issues 
 
// Could also just add 1 to the date 
 
end.setUTCHours(end.getUTCHours() + 24) 
 

 
console.log('Client date: ' + clientDate.toISOString() + 
 
    '\nstart date : ' + start.toString() + 
 
    '\nend date : ' + end.toString());

對於我在格林威治東邊,5月10日UTC的開始在我當地時區的5月10日,因此我看到了5月10日的開始和結束日期。對於格林威治以西的用戶,5月10日5月9日開始,所以他們將在5月9日看到開始和結束日期。

我希望這是有道理的(並且是你以後的)。

如果,另一方面,在值req.params是客戶價值,你必須知道客戶端時區,以便將它們調整到正確的日期偏移。