8

ISODate 形式を必要とする mongo の日付フィールドを更新しようとしています。モンゴでは、次のようになります。

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

私が使用しているJavaフレームワークでは、テストパラメータとして文字列を使用するように制限されているため、その文字列をaで使用しDateTimeFormatterて正しいものにしISODateTimeFormatてからmongoに渡そうとしています。上記のような文字列を渡すことはできません。そうしようとすると、mongo のフィールドが台無しになります。私が使用しているJoda-Timeコードの関連部分は次のようになります。

//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);

コードを実行すると、.parseDateTime メソッドから次のようなエラーが発生します。

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)

私が与えている文字列は、解析するには正しくないことがわかります。Z. _ では、基本的に、 を機能させて.parseDateTime正しいように見えるオブジェクトを得るには、最初の文字列は何にする必要があるのでしょうか?

編集:

以下の提案を試すために更新されました。私が今遭遇した問題は IllegalArgumentException で、クラス org.joda.time.DateTime をシリアライズできません。それで、joda の time オブジェクトを保持しているように見えますか? また、Spring Data のようなマッパー フレームワークを調べて、他の提案も調べました。これには、さらに多くのことが必要なようです。これをmongoに永続化する簡単な方法は本当にありませんか?

EDIT2:

わかりました、私は今それを持っていると思います。動作中のすべてのメカニズムを完全に把握しているわけではないかもしれませんが、BasicDBObjectはDateTimeとうまく機能しません。少なくとも私が扱っている実装では、日付オブジェクトが唯一の方法のようです。私は次のことをしました:

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

次に、BasicDBObject の newResult を渡して、mongo のレコードを更新しました。正常に動作し、レコードは正しく更新されます。

4

4 に答える 4

7

UTC を表すことを意図している限り、入力文字列の形式は正しいです。

この形式に一致するものを使用するようにパーサーを変更します。

DateTimeFormatter parser = ISODateTimeFormat.dateTime();

あなたの質問の残りの部分は、私にはあまり意味がありません。を渡すのparserではなく、parseDateTimeキャプチャしていないように見える からの戻り値を渡す必要があります。

DateTime result = parser.parseDateTime(crDt);

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

最後の行が機能するかどうかは、その関数が受け入れるものによって異なります。

于 2013-08-19T18:29:57.920 に答える
5

MongoDB の更新を行う Service クラスのコンストラクターに「エンコード フック」を追加することで、これを解決しました。これにより、コードで org.joda.time.DateTime を使用できるようになり、MongoDB で java.util.Date として保存されます。

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");
    }

}
于 2014-04-17T11:23:20.967 に答える