6

Windows 上の MongoDB シェルで、次の値でクエリを実行した場合

new ISODate('0001-01-01T00:00:00Z')

実際に検索するようです

new ISODate('1901-01-01T00:00:00Z')

"new ISODate('0001-01-01T00:00:00Z')" を Mongo シェルに直接入力すると、ISODate("1901-01-01T00:00:00Z") が返されるため、この変換が行われていることがわかります。

奇妙なことに、「new ISODate」の代わりに「new Date」を使用すると、次のように入力します。

new Date('0001-01-01T:00:00:00Z')

正しい ISODate("0001-01-01T00:00:00Z") を返します。

どちらもドキュメントに従って ISODate を返すことになっており、私の考えでは同じように動作するはずです。なぜそうしないのか、そしてそれがバグなのか機能なのかを知っている人はいますか?

4

1 に答える 1

5

内部的には、new ISODate実際には次のことを意味します。

Date.UTC(year, month, date, hour, min, sec, ms);

IE では、MongoDB は正規表現を使用して文字列を要素に分割します ( https://github.com/mongodb/mongo/blob/master/src/mongo/shell/types.js#L56の 60 行目) 。

JavaScript の Date オブジェクトには、いくつかの異なる初期化子があります ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date#Syntax )。使用する場合:

new Date("0001-01-01T:00:00:00");

次に、4 桁の年0001は解析または解釈されませんが、MongoDB のように使用すると、次のようになります。

Date.UTC( parseInt("0001") )

その後、00 ~ 99 年には特別な規則が適用されます。https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date#Date_instancesのドキュメントは、これをわずかに示唆しています。

既にhttps://jira.mongodb.org/browse/SERVER-8164に MongoDB サーバー チケットがあります。投票してください。

于 2013-07-24T12:46:32.423 に答える