2017-03-10 6 views
0

Ich versuche gerade, Datum einzufügen und zu finden, das in MongoDB eingefügt wird. Mir wurde klar, dass MongoDB das Datum in UTC umwandelt, während es in der Datenbank gespeichert wird. Ich benutze Javafx Datumsauswahl für die Auswahl Datum.Java Date zu MongoDB einfügen und finden

Diese meine Funktion ist Zeichenfolge bisher

public static Date setTime(String strdate,int ch){ 
    int yr,mth,dt; 
    yr=Integer.parseInt(strdate.substring(0,4)); 
    mth=Integer.parseInt((strdate.substring(5,7))); 
    dt=Integer.parseInt(strdate.substring(8,10)); 
    Date date=new Date(); 
    if(ch==0) { 
     date.setHours(0); 
     date.setMinutes(0); 
     date.setSeconds(0); 
     date.setYear(yr - 1900); 
     date.setMonth(mth - 1); 
     date.setDate(dt); 
    } 
    else if(ch==1) { 
     date.setHours(0); 
     date.setMinutes(0); 
     date.setSeconds(0); 
     date.setYear(yr - 1900); 
     date.setMonth(mth - 1); 
     date.setDate(dt+1); 
    } 
    return date; 
} 

Zur Lagerung

Date newdate=new Date(); 
String picked_date=""+date.getValue(); //date is DatePicker object 
newdate= MyDateTime.setTime(picked_date,0); 
Document doc=new Document(); 
doc.append("date",newdate); 
coll.insertOne(doc); 

Hier zum Konvertieren, ich bin Abrufen Filter mit

String findDate=""+datePicker.getValue(); 
Date startdate= MyDateTime.setTime(findDate,0); 
Date nextdate=MyDateTime.setTime(findDate,1); 
Bson filter=Filters.and(Filters.gte("date",startdate),Filters.lt("date",nextdate)); 
List<Document> ls = new ArrayList<Document>(); 
coll.find(filter).into(ls); 
for (Document doc : ls 
      ) { 
System.out.println(doc.getDate("date").toString()); 
} 

Nun ist das Problem betrachten wenn ich Datum von DatePicker wähle, bekomme ich "2017-03-10" Jetzt, wenn ich versuche das Datum mit "2017-03-9" zu finden, der Datensatz für den 10. März wird abgerufen und für "2017-03-10" wird noch der gleiche Datensatz abgerufen. Ich bin immer noch verwirrt, warum dasselbe Dokument für 9 und 10 Daten abgerufen wird.

+0

Sie können die relevanten Dokumente hinzufügen, die Sie abfragen möchten. Was ist deine Java-Version? – Veeram

+0

Ich benutze derzeit Java 8, und ich Frage auf eingelegtes Dokument, wo ich Datum speichern ... –

Antwort

0

Versuchen Sie es mit dem neuen Datum Zeit API Teil von Java 8. Sie können Ihre Datum Zeit Logik leicht konvertieren.

Insertion:

String pickedDate ="2017-03-09"; 
    Instant instant = LocalDateTime.of(LocalDate.parse(pickedDate), LocalTime.MIDNIGHT).atZone(ZoneId.systemDefault()).toInstant(); 
    Document doc = new Document(); 
    doc.append("date",Date.from(instant)); 
    coll.insertOne(doc); 

Retrieval:

String findDate = "2017-03-09"; 
Instant startInstant = LocalDateTime.of(LocalDate.parse(findDate), LocalTime.MIDNIGHT).atZone(ZoneId.systemDefault()).toInstant(); 
Instant nextInstant = startInstant.plus(1, ChronoUnit.DAYS); 

Bson filter = Filters.and(Filters.gte("date", Date.from(startInstant)),Filters.lt("date",Date.from(nextInstant))); 
List<Document> results = coll.find(filter).into(new ArrayList<>()); 

Hier ist die fix und Erklärung, wenn Sie nicht wollen, neue Datum Zeitbibliotheken verwenden.

Der Grund, warum Ihre Logik nicht als Ignorieren der Einstellung von Millisekunden funktioniert.

Wenn Sie den Datensatz speichern, wird ein Wert in Millisekunden für das Datum gespeichert.

Wenn Sie den Datumsfilter einstellen, haben Sie möglicherweise einen anderen Millisekundenwert und abhängig von diesem Wert können Sie unterschiedliche Ergebnisse erzielen.

Zum Beispiel, wenn Sie speichern, haben Sie so etwas 2017-03-09 00:00:00:345 & 2017-03-10 00:00:00:234.

Wenn Sie den Datumsfilter einstellen, liegt der Millisekundenwert zwischen 0 und 999, basierend auf Ihrer Uhr.

So zum Beispiel für Datum 2017-03-09, der eingestellte Wert ist 2017-03-09 00:00:00:349 & 2017-03-10 00:00:00:280, dann werden Sie ein Dokument mit 2017-03-10 00:00:00:234 erhalten.

Ähnliches gilt für Datum 2017-03-10, der eingestellte Wert ist 2017-03-09 00:00:00:280 & 2017-03-11 00:00:00:999, dann werden Sie ein Dokument mit 2017-03-10 00:00:00:234 erhalten.

Das obige Beispiel dient nur dazu, Ihren Fall zu demonstrieren, aber basierend auf Ihrer Uhr können Sie verschiedene Ergebnisse erzielen, wenn Sie es mehrmals ausführen.

Verwenden Sie Kalender, um Ihre Zeichenfolge zu Datum-Funktion zu beheben.

public static Date setTime(String strdate, int ch){ 

     int yr, mth, dt; 
     yr = Integer.parseInt(strdate.substring(0,4)); 
     mth = Integer.parseInt((strdate.substring(5,7))); 
     dt = Integer.parseInt(strdate.substring(8,10)); 

     Calendar calendar = Calendar.getInstance(); 
     calendar.setTime(new Date()); 
     calendar.set(Calendar.HOUR_OF_DAY, 0); 
     calendar.set(Calendar.MINUTE, 0); 
     calendar.set(Calendar.SECOND, 0); 
     calendar.set(Calendar.MILLISECOND, 0); 
     calendar.set(Calendar.YEAR, yr); 
     calendar.set(Calendar.MONTH, mth - 1); 

     if(ch==0) { 
     calendar.set(Calendar.DAY_OF_MONTH, dt); 
     } 
     else if(ch==1) { 
     calendar.set(Calendar.DAY_OF_MONTH, dt + 1); 
     } 

     return calendar.getTime(); 

} 
+0

das hat gut funktioniert, vielen Dank für die Zeit und für die saubere Erklärung. Ich habe auch versucht, den Wert von Stunden, Minuten und Sekunden für das Datum zu setzen, aber das hat nicht funktioniert, aber ich glaube nicht, dass es jetzt reibungslos funktioniert. –

+0

Sie sind willkommen. Sie tun, dass bereits der Teil, den Sie vermissen, Millisekunden ist, die Sie nur durch Kalender setzen können, der in der zweiten Lösung erwähnt wird – Veeram