2013-08-19 2 views
6

Ich versuche, Datumsfelder in Mongo zu aktualisieren, die ein ISODate-Format erfordern. In Mongo, sieht es wie folgt aus:Verwenden von Joda-Time, um korrekte ISODate für Mongo zu erstellen Einfügen

"crDt" : ISODate("2013-08-19T17:21:57.549Z") 

Der Java-Framework I hat mich mit Strings als meine Testparameter beschränkt verwenden, so versuche ich, diese Zeichenfolge mit einem DateTimeFormatter zu verwenden, um es in die richtigen ISODateTimeFormat zu bekommen und dann mongo. Ich kann nicht einfach eine Saite übergeben, die aussieht wie das, was ich oben habe. Der Versuch, dies zu tun, zerschlägt das Feld in Mongo. Die entsprechenden Bits von Joda-Time Code Ich verwende wie folgt aussehen:

//I can't get this right. 
String crDt = "2013-01-19T15:28:58.851Z"; 

DateTimeFormatter parser = ISODateTimeFormat.dateHourMinuteSecondMillis(); 

parser.parseDateTime(crDt); 

// this method updates the record in mongo. This method totally works, so no 
// point in pasting it here, I just can't get the parser object correct to be 
// in the correct format once inserted, it needs to be the correct ISODate form. 
mongo.setCrDt(recordId, parser); 

Und wenn der Code ausgeführt wird bekomme ich Fehler wie diese aus der .parseDateTime Methode:

java.lang.IllegalArgumentException: Invalid format: "2013-01-19T15:28:58.851Z" is malformed at "Z" 
    at org.joda.time.format.DateTimeFormatter.parseDateTime(DateTimeFormatter.java:866) 

ich die Zeichenfolge sagen kann, ich bin Geben ist nicht korrekt, um Dinge geparst zu bekommen. Ich habe versucht, die Z zu verlassen, ich habe andere Kombinationen ausprobiert, aber jedes Mal sagt es, dass es falsch ist. Also im Grunde, was muss meine Startstrange sein, damit die .parseDateTime funktioniert und mir ein Objekt gibt, das richtig aussieht?

EDIT:

aktualisiert die folgenden Vorschläge zu versuchen. Das Problem, mit dem ich jetzt konfrontiert bin, ist eine IllegalArgumentException, die Klasse org.joda.time.DateTime kann nicht serialisiert werden. So scheint es, dass joda Zeitobjekte in einem No-Go bleiben? Ich schaute mir auch den anderen Vorschlag an und untersuchte Mapper-Frameworks wie Spring Data. Es sieht so aus, als müsste noch viel mehr dahintersteckt. Gibt es wirklich keine einfache Möglichkeit, dies in Mongo zu bestehen?

EDIT2:

OK, ich glaube, ich es jetzt habe. Ich habe vielleicht nicht alle Mechaniken im Spiel, aber BasicDBObject s wird nicht nett mit DateTime spielen. Date-Objekte scheinen der einzige Weg zu sein, zumindest in der Implementierung, mit der ich es zu tun habe. Ich habe folgendes:

DateTimeFormatter parser = ISODateTimeFormat.dateTime(); 
DateTime result; 
Date newResult; 
result = parser.parseDateTime(crDt); 
newResult = result.toDate(); 

ich dann in newResult für die BasicDBObject weitergegeben aktualisieren Sie die Aufzeichnung in Mongo. Es funktioniert einwandfrei und der Datensatz wird korrekt aktualisiert.

Antwort

7

Ihr Eingabeformat ist korrekt, solange es UTC darstellen soll.

Ihre Parser Ändern Sie die man verwenden, die dieses Format entspricht:

DateTimeFormatter parser = ISODateTimeFormat.dateTime(); 

Der Rest Ihrer Frage an mich macht nicht viel Sinn. Sie sollten nicht die parser übergeben, sondern den Rückgabewert von parseDateTime, den Sie nicht zu erfassen scheinen.

DateTime result = parser.parseDateTime(crDt); 

mongo.setCrDt(recordId, result.toDate()); 

Ob diese letzte Zeile funktioniert, hängt davon ab, was diese Funktion akzeptiert.

+0

Siehe auch: http://stackoverflow.com/a/17892816/634824 –

+0

ich jetzt eine Illegal beim Versuch der Serialisierung DateTime-Objekt Ähnlich und basierend auf diesem anderen Stackoverflow-Link klingt es so, als müsste ich etwas wie Spring für MongoDB verwenden. Ich bin mir nicht sicher, wo ich anfangen soll, ich muss lediglich einige Felder in Mongo aktualisieren. – Benny

+0

Eine Menge davon hängt davon ab, wie genau Sie das Objekt beibehalten, aber Sie haben nicht die Interna (oder relevanten Teile) der 'setCrDt' Methode gezeigt, daher ist es schwierig zu antworten. Es kann so einfach sein, '.toDate()' auf dem Ergebnis aufzurufen, um ein Java-'Datum' zu erhalten, wenn Ihre Implementierung das versteht. Oder es könnte viel komplexer sein. Schwer zu sagen ohne mehr Details. –

3

Die Antwort von Matt Johnson ist richtig. Aber es könnte noch einfacher sein: Übergeben Sie die Zeichenfolge (ISO 8601) direkt an den Konstruktor DateTime. Kein Formatierer erforderlich.

Zeitzone beachten. Ein DateTime-Objekt in Joda-Time kennt seine eigene zugewiesene Zeitzone im Gegensatz zu einem java.util.Date-Objekt.Soll das DateTime-Objekt der Standardzeitzone der JVM, keiner Zeitzone (UTC) oder einer bestimmten Zeitzone zugewiesen werden?

Für ein Datum-Uhrzeit zugewiesen die Standardzeitzone.

Für eine Datum/Uhrzeit zugewiesene UTC/GMT (keine Zeitzonenverschiebung).

DateTime dateTime = new DateTime("2013-01-19T15:28:58.851Z", DateTimeZone.UTC); 

Für ein Datum und eine Uhrzeit, die einer bestimmten Zeitzone zugewiesen wurden.

DateTime dateTime = new DateTime("2013-01-19T15:28:58.851Z", DateTimeZone.forId("Europe/Paris")); 
5

Ich löste dies durch ein „Encoding Hook“ in dem Konstruktor der Service-Klasse hinzugefügt werden, wobei ich das Updates zu MongoDB tun. Dadurch können Sie org.joda.time.DateTime in Ihrem Code verwenden, das in MongoDB als java.util.Date gespeichert wird.

MyService.java

@Inject 
public MyService(com.mongodb.Client client) { 
     BSON.addEncodingHook(DateTime.class, new JodaTimeTransformer()); 
     BSON.addDecodingHook(Date.class, new JodaTimeTransformer()); 
     this.mongoClient = mongoClient; 
} 

JodaTimeTransformer.java

import java.util.Date; 

import org.joda.time.DateTime; 

public class JodaTimeTransformer implements org.bson.Transformer { 

    @Override 
    public Object transform(Object o) { 
     if(o instanceof DateTime) { 
      return ((DateTime)o).toDate(); 
     } 
     else if(o instanceof Date) { 
      return new DateTime((Date) o); 
     } 
     throw new IllegalArgumentException("JodaTimeTransformer can only be used with DateTime or Date"); 
    } 

} 
Verwandte Themen