2017-10-07 2 views
1

"날짜"필드가 startDate와 endDate 사이에있는 모든 레코드를 가져 오려고합니다.날짜로 필터링 할 때 Mongodb 시간대 문제

나는이와 DB를 조회하고 (오늘까지 달의 처음부터 기록을 얻을 수 있습니다) 날짜

var startDate = new Date(2017,09,1); 
    var endDate = new Date(2017,09,7); 

//console.log(startDate) = Sun Oct 01 2017 00:00:00 GMT-0300 (BRT) 
//console.log(endDate) = Sat Oct 07 2017 00:00:00 GMT-0300 (BRT) 

    Sale.find({date:{"$gte":startDate,"$lt":endDate}},function(err, sales){ 

    } 
10월 2일 및 10/07과 반환 사이의 날짜와

기록 만 기록을 10/01은 반환되지 않습니다. 여기없는 레코드의 날짜 필드는 다음과 같습니다

"date": { 
     "$date": "2017-10-01T23:00:00.000Z" 
    } 

나는 그것이 차이 (시간대 등)을 만들 것입니다 있는지 확인하기 위해 23 시간을 설정하지만하지 않았다.

startDate를 9 월 30 일 23 시로 설정하면 아무 것도 표시되지 않습니다. 시간 22, 21, 아무것도. startDate가 9 월 30 일, 20시, 빙고가되면 기록이 반환됩니다.

이것은 아마도 시간대 문제 일 수 있지만 위치 및 방법을 식별 할 수는 없습니다.

+0

,'새로운 날짜 (2017,09,1)를 ;'는'Wed'01 Nov 01 2017 00:00:00 GMT-0400 (EDT)'을 반환합니다. 왜냐하면 0은 1 월이기 때문입니다. 그러나 그것은 당신이보고있는 행동을 설명하지는 않습니다. –

+0

데이터가 MongoDB에 쓰여지는 시간대는 무엇입니까? UTC 또는 지역? –

+0

로컬이지만 새로운 Date() 객체도 그렇게해야합니까? 나는 날짜의 console.log로 질문을 갱신했다. –

답변

2

2017-10-01T23:00:00.000Z은 GMT 시간입니다. 이 new Date(2017,10,01);은 현지 시간이며 그리니치 자오선에 앉지 않는 즉시 위와 같지 않습니다.

JS는 기본 날짜 이후 GMT 초 단위로 날짜를 저장합니다.

따라서 첫 번째 경우 초 수가 X이고 두 번째 경우가 X + Date.getTimezoneOffset()입니다.

당신은이 기능을 사용할 수 있습니다

:

function ZDate(year,month,day) { 
    return new Date(year + "-" + month + "-" + day); 
} 

또는 RobG로

제안 : 여기

function ZDate(year,month,day) { 
    return Date.UTC(year, month-1, day); 
} 

: JS에서

var startDate = ZDate(2017,09,1); 
var endDate = ZDate(2017,09,7); ` 
+0

답변을 업데이트했습니다. 하지만 먼저 2017,09,1이 무슨 뜻인지 결정해야합니다. 귀하의 지역 TZ에서 날짜를 누른 다음 코드가 정확하거나 2017,09,1은 그리니치 표준시입니다. 그런 다음 위의 ZDate를 사용하십시오. –

+2

ISO 8601에서는 날짜 전용 양식이 시간대를 허용하지 않으므로 잘못된 "Z"가 무시되거나 유효하지 않은 날짜와 같이 처리됩니다. ECMA-262에서 6까지의 날짜 전용 양식 *은 UTC (ISO 8601과 반대)로 취급되어야하므로 '새로운 날짜 ('2017-10-01 ')는 UTC입니다. 명시 적으로 이것을 UTC로 취급하고 싶다면'new Date (Date.UTC (y, m-1, d))'가 더 좋은 방법입니다 (그리고 내장 된 파서의 모호함을 피할 수 있습니다). – RobG