sql >> データベース >  >> NoSQL >> MongoDB

文字列からJavaを介して読み取ったのと同じ日付をmongodbに挿入するにはどうすればよいですか?

    現在実行しようとしていることには2つの問題があります。

    1. コードの2行目にタイプミスがあります。これは、月が分として解析されていることを意味します。
    2. 前述のように、タイムゾーンを考慮していません。

    最初の問題に対処するには、変更する必要があります

    Date d2 = new SimpleDateFormat("dd/mm/yyyy").parse(arr[10]);
    

    Date d2 = new SimpleDateFormat("dd/MM/yyyy").parse(arr[10]);
    

    日付形式では大文字と小文字が区別されます。あなたが行おうとしていたのは、月を** M**onthではなく**m**inuteとして解析することです。私が実行したテストでは、すべての月が1月として出てきたことを意味します。これは、あなたの例でも起こっていることがわかります。また、コードの最初の行であるフォーマッター(正しく設定されている)が使用されていないことに気付きました。

    2番目の問題は、そうです、JavaのDate ■期待どおりに動作しません。あなたが単に日付のためにそれを気にしないとしても、彼らは時間の要素を持たなければなりません。さらに、時間があるため、タイムゾーンが必要です。

    優れたJodaライブラリに移動する選択肢がない場合は、これを回避する方法があります。これを実証するテストを作成しました:

    @Test
    public void shouldParseDateCorrectly() throws Exception {
        // Given
        SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
        format.setTimeZone(TimeZone.getTimeZone("UTC"));
    
        // When
        Date parsedDate = format.parse("21/08/2012");
    
        // Then
        Assert.assertThat(parsedDate.toString(), is("Tue Aug 21 02:00:00 CEST 2012"));
        Assert.assertThat(parsedDate.toGMTString(), is("21 Aug 2012 00:00:00 GMT"));
    }
    

    したがって、正しい形式を使用したことがわかりますが、タイムゾーンをUTCに設定しました(オフセットがゼロで、夏時間がありません)。次に、このフォーマッターを使用して日付を解析すると、UTCタイムゾーンの真夜中の時刻で日付が出力されます。私のコンピューターはヨーロッパにあるため、この日付を印刷すると、午前2時と表示されます。これは、このタイムゾーンがUTCより2時間進んでいるためです。しかし、非推奨のtoGMTStringを使用すると 方法では、時間はゼロとして出てきます。

    Javaドライバーを使用してこの日付をMongoDBに保存すると、日付だけが気になる場合でも、日付、時刻、およびタイムゾーンが保存されます。日付を読み直すときに行う必要があるのは、日付がUTCであることを覚えて、タイムゾーンを適切に設定することです。

    または、タイムゾーンを変更せずにMongoDBに保存することもできます。ただし、常に同じタイムゾーンで読み取りと書き込みを行う必要があります。しかし、これには、a)深夜の時間を処理し、b)夏時間が開始(または停止)するときに、予期しないバグが発生します。

    または、Joda-Time を使用してください 。



    1. TornadoからRedisを*適切に*クエリするにはどうすればよいですか?

    2. MongoDBクエリ:$ near withgregation

    3. grailsの関連付けフィールドのdirtyPropertyNamesプロパティ値を取得できません

    4. Mongo集計複数の値に一致