nodejs,mongodb不同時區問題


問題:不同國家,使用不同時區,而服務器代碼卻在國內,跨時區日期不同,根據日期查詢,查詢不到數據了

1.mongodb存儲的new Date()是UTC時間,也就是0時區的時間,世界標准時間

2.參考moment官網,時區問題: http://momentjs.com/timezone/docs/

npm install moment-timezone

var moment = require('moment-timezone');
console.log(moment('2018-08-17T07:46:37.000+08:00').tz("Asia/Tokyo").format('YYYY/MM/DD HH:mm:ss'))//Asia/Tokyo,Asia/Hong_Kong,America/New_York,Asia/Shanghai
console.log('上海:'+moment().tz("Asia/Shanghai").format('YYYY/MM/DD HH:mm:ss'))
console.log('香港:'+moment().tz("Asia/Shanghai").format('YYYY/MM/DD HH:mm:ss'))
console.log('日本:'+moment().tz("Asia/Tokyo").format('YYYY/MM/DD HH:mm:ss'))
console.log('紐約:'+moment().tz("America/New_York").format('YYYY/MM/DD HH:mm:ss'))

更多支持的時區,請參考moment-timezone源碼 moment-timezone/builds/moment-timezone-with-data-2012-2022.js

 

存入數據庫:moment().tz("Asia/Tokyo").format('YYYY/MM/DD HH:mm:ss')  因為mongodb是弱數據類型的,可以直接存入字符串,即使你在schema中定義的是Date類型 moment().tz('Asia/Tokyo').add(-24,'hours').format('YYYY/MM/DD HH:mm:ss')

zoneconfig.create({
"zoneTime": "Asia/Tokyo",
"siteId": ['aaaa'],
"createTime": moment().tz('Asia/Tokyo').format('YYYY/MM/DD HH:mm:ss')
})

3.由於用的是阿里雲的linux服務器,

monggo日期條件

const queryBetweenDate = {
$gte: new Date(new Date(mongoDate).getTime()),
$lt: new Date(new Date(mongoDate).getTime() + 86400000)
}

 

postMan輸入的參數是mongoDate: 2018/08/24, 在本地是可以的,

本地打印:

{ '$gte': 2018-08-24T16:00:00.000Z,
'$lt': 2018-08-25T16:00:00.000Z }

但在服務上,打印的條件確是;

 

{ '$gte': 2018-08-23T16:00:00.000Z,
'$lt': 2018-08-24T16:00:00.000Z }

本地代碼和服務器代碼一摸一樣,服務上卻查不出來了,懵圈。。

不管是幾點,打印都是T16:00:00.000Z

最后,加了8小時,發到服務上的日期條件為

const queryBetweenDate = {
$gte: new Date(new Date(mongoDate).getTime()+1000*60*60*8),
$lt: new Date(new Date(mongoDate).getTime() + 86400000+1000*60*60*8)
}

至此,問題已解決。   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM