2017-01-06 6 views
0

質問 文字列をMongoDBの日付として解析する際には、どのような実装が推奨されますか?MongoDB日付とISODate構文解析

"2017-01-01"と "2017/01/01"の形式で日付の文字列表現をベンダーに送信しているので、これを尋ねます。私は、これらの異なる文字列を解析すると、Date()とISODate()を使用してMongoDBで同じ結果が返されると考えていたでしょう。

はMongoDBの3.4

に対してMongoChefを通じて
1. print(new Date("2016-01-01")) 
2. print(new Date("2016/01/01")) 
3. print(new ISODate("2016-01-01")) 
4. print(new ISODate("2016/01/01")) 

実行されている次の例を考えるとこれは私にはどんな意味がありません、以下の結果

1. Thu Dec 31 2015 18:00:00 GMT-0600 (Central Standard Time) 
2. Fri Jan 01 2016 00:00:00 GMT-0600 (Central Standard Time) 
3. Thu Dec 31 2015 18:00:00 GMT-0600 (Central Standard Time) 
4. 2017-01-06T10:34:01.814-0600 E QUERY [thread1] Error: invalid ISO date 

を生成します。これを私に説明することができれば誰でも大いに感謝するだろう。

私に受け入れられるものはオプション2です。したがって、日付がすべて「/」で区切られ、新しいDate()コンストラクタが使用されていることを確認します。

答えて

1

"2017-01-01"および"2017/01/01"。これを短くするには、最初のものをISO形式にして、UTC時間と2番目のもの(非ISO形式)を解析し、ローカルタイムゾーンで時間を解析します。

Mongoシェルの出力を考えてみましょう。すべての時間はUTC時間で表示されます。

1.new Date("2016-01-01") ---- ISODate("2016-01-01T00:00:00Z") 
2.new Date("2016/01/01") ---- ISODate("2016-01-01T06:00:00Z") 
3.new ISODate("2016-01-01") ---- ISODate("2016-01-01T00:00:00Z") 
4.new ISODate("2016/01/01") ----2017-01-06T11:14:56.862-0600 E QUERY [thread1] Error: invalid ISO date : 

Mongo dbはすべての日付をUTC時刻で保存します。

Mongoシェフは、上記の保存されたすべてのUTCの日付時刻の値をローカルタイムゾーン(-06:00オフセット)に変換します。

したがって、ISODate("2016-01-01T00:00:00Z")ISODate("2016-01-01T06:00:00Z")の間です。

どちらもUTCの日付です。日付部分(深夜に設定された部分)のみに興味があるように見えますが、オプション2(new Date("2016/01/01") ---- ISODate("2016-01-01T06:00:00Z"))が選択され、同じように日付を作成している限り、すべてのコンパートメントクエリは正常に機能します保存しながら。

参考:

https://docs.mongodb.com/manual/reference/bson-types/#document-bson-type-date

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date