2017-10-10 7 views
0

J'essaie d'obtenir des rendez-vous pour une date particulière.Spring-boot: mongoDB comparaison de date ne fonctionne pas

Donc je passe fromDate et toDate pour trouver des données dans cette période.

Voici mon code, dans lequel la méthode de requête modifie la date réelle qui lui est transmise.

J'ai également collé la requête formée par ce code dans botte de ressort.

DateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS\'Z\'"); 

fromDate = "2017-10-06T00:00:00.000Z"; 
toDate = "2017-10-07T23:00:00.000Z";   

Date startDate,endDate; 

startDate = dateFormatter.parse(fromDate); 
endDate = dateFormatter.parse(toDate); 

System.out.println(startDate); 
System.out.println(endDate); 

Query q = new Query().addCriteria(new Criteria().orOperator(
      new Criteria().andOperator(Criteria.where("fromDate").gte(startDate), 
      Criteria.where("fromDate").lte(endDate)), 
      new Criteria().andOperator(Criteria.where("toDate").gte(startDate), 
      Criteria.where("toDate").lte(endDate)) 
     )); 

System.out.println(startDate); 
System.out.println(endDate); 

System.out.println(q); //here in query m getting different date 

List<Appointment> result= mongoTemplate.find(q, Appointment.class); 

System.out.println(result); 

Quand je suis en train d'imprimer la requête, il imprime le JSON suivant ce qui est faux:

{ 
    "$or": [ 
     { 
      "$and": [ 
       { 
        "fromDate": { 
         "$gte": { 
          "$date": "2017-10-05T18:30:00.000Z" //expected date 2017-10-06 
         } 
        } 
       }, 
       { 
        "fromDate": { 
         "$lte": { 
          "$date": "2017-10-07T17:30:00.000Z" 
         } 
        } 
       } 
      ] 
     }, 
     { 
      "$and": [ 
       { 
        "toDate": { 
         "$gte": { 
          "$date": "2017-10-05T18:30:00.000Z" 
         } 
        } 
       }, 
       { 
        "toDate": { 
         "$lte": { 
          "$date": "2017-10-07T17:30:00.000Z" 
         } 
        } 
       } 
      ] 
     } 
    ] 
} 

Ma date prévue étaient "2017-10-06T00: 00: 00.000Z" et « 2017 -10-07T23: 00: 00.000Z ".

Répondre

0

Vous devez définir le fuseau horaire sur UTC lorsque vous utilisez DateFormat pour analyser les dates de chaîne.

Vous pouvez également utiliser Instant en Java 8.

je l'ai montré les deux exemples.

endDate en utilisant dateFormatter avec fuseau horaire défini sur UTC

startDate utilisant Instant

Quelque chose comme

DateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS\'Z\'"); 
dateFormatter.setTimeZone(TimeZone.getTimeZone("UTC")); 

Date startDate,endDate; 

startDate = Date.from(Instant.parse("2017-10-06T00:00:00.000Z")); 
endDate = dateFormatter.parse("2017-10-07T23:00:00.000Z");