0

外部ソースから自分のプログラムにデータを取り込み、ISO8601 日付が添付されていますが、時間/分/秒をゼロに設定することが要件の 1 つです。これは、日付を受け取る前に発生します。だから私はデータからこれを取得します。

2013-05-17T00:00:00.000Z

例えば。次に、その値を「businessDay」という Joda DateTime オブジェクトに入れます。この値に基づいていくつかの処理を行いますが、MongoDB に永続化する必要があります。

Joda DateTime オブジェクトはシリアル化できないため、DateTime オブジェクトを Date オブジェクトに入れ、それを Mongo に保持する必要があります (そして、それが出てきたらそれを元に戻します)。

このように Joda を使用すると businessDay.toDate()、Java Date オブジェクトを受け取りますが、

Sun May 19 20:00:00 EDT 2013

通常印刷される businessDay は

2013-05-20T00:00:00.000Z

それはそれを私のローカルタイムゾーンに変換し、前日にします。私が欲しいのは、DateTime オブジェクトを、値を保持する Date オブジェクトに変換することです。

私は DateTimeFormatter でたくさんのことを試してきましたが、まったく機能しません。私はまた、すべての努力を削除してきました。それ以外の場合はここに貼り付けますが、これを理解しようと一日中これを行ってきました.

ご協力ありがとうございます。

編集:

String Date を Joda DateTime オブジェクトに変換するメソッドを示しています。

 private DateTime asDateTime(String value) {
        // Was experiencing an issue converting DateTime to date, it would convert to localtime zone
        // giving me the wrong date. I am splitting the value into its year/month/day values and using a dateFormatter
        // to give me an appropriate format for the date. Timezone is based on UTC.
        String[] splitValue = value.split("-");
        String[] splitDay = splitValue[2].split("T");
        int year = Integer.parseInt(splitValue[0]);
        int month = Integer.parseInt(splitValue[1]);
        int day = Integer.parseInt(splitDay[0]);
        DateTime date = new DateTime(DateTimeZone.UTC).withDate(year, month, day).withTime(0, 0, 0, 0);
        return date;
    }
4

2 に答える 2

2

まず、日付を取得したばかりの場合は、LocalDateではなくを使用することをお勧めしDateTimeます。ただし、次のことを誤解していると思いますjava.util.Date

それはそれを私のローカルタイムゾーンに変換し、前日にします。

いいえ、そうではありません。あなたのDateTime値は正確には 2013-05-20T00:00:00.000Z です。現在、ajava.util.DateはUnix エポックからのミリ秒数ですタイムゾーンの概念はまったくありません。Joda Time に相当しInstantます。

を呼び出すtoString()Date、瞬間がローカル タイム ゾーンに変換されますが、それはオブジェクトの状態の一部ではありません

したがって、あなたDateTimeとあなたの両方Dateが UTC 5 月 20 日の真夜中を表します。MongoDB がその値で何をしているのかはわかりませんが、Joda Time から への変換だけでは、java.util.Dateタイムゾーンの変換は実行されませんでした

于 2013-05-20T05:32:22.623 に答える