2

JavaScript Date() オブジェクトのコンストラクターを介して無効な日付を渡すと、IE9 は有効な Date を作成しているように見えます。たとえば、"56 Aug 2009" は日付オブジェクト インスタンスを返します。対照的に、Chrome はそうではありません。

IE9 の Date オブジェクトに関する MSDN ドキュメント (以下のリンク) を読んで、次のような段落があります。

JavaScript は、日付形式に関してかなり柔軟です。2009 年 8 月 24 日、2009 年 8 月 24 日、 2009年 8 月 24 日などのバリアントを使用できます。詳細については、日付と時刻の文字列の書式設定 (JavaScript) を参照してください。

上記の段落から引用: http://msdn.microsoft.com/en-us/library/ee532932(v=vs.94).aspx

次のコード スニペットは、日付が有効かどうかを確認するために使用されます。Chrome では動作しますが、IE9 では動作しません:

function validateDate(d) {
    var dt = new Date(d);
    if (Object.prototype.toString.call(dt) !== "[object Date]") return false;

    return !isNaN(dt.getTime());
}

このコードを実行すると:

console.log(new Date("56 Aug 2009"));

IE9 の結果

Fri Sep 25 00:00:00 UTC+0100 2009

クロムの結果

Invalid Date

より詳細な例を含む JsFiddle を次に示します。

http://jsfiddle.net/WKMdc/8/

この動作は予期しないものです (おそらく、間違った仮定や、気づかれないようになっている検証のバグが原因です!)。

日付が有効であることを確認し、IE9 で動作し、ネイティブ ブラウザー機能を使用できるようにする代替方法はありますか?

4

3 に答える 3

2

João からの回答でも指摘されているように、問題は、コンストラクターを介して新しい Date オブジェクトを作成するときに、ブラウザーが不一致がある場合に日数の追加を実行することで「役立つ」ことです。たとえば、2013 年 2 月 29 日は有効な日付ではありません。 (2013 年の 2 月は 28 日しかありません) は、2013 年 3 月 1 日、または元の日付から + 1 日になります。

私のシナリオでは、2013 年 2 月 29 日に無効なエントリとしてユーザーにフラグを付けたいので、これはあまり役に立ちません。

以下の日付を作成しようとしています:

var parsedDate = new Date("29 Feb 2013");

ブラウザーごとに次の Date オブジェクトを返します。

IE9 - 2013 年 3 月 1 日金曜日 00:00:00 UTC

サファリ- 2013 年 3 月 1 日金曜日 00:00:00 GMT+0000 (GMT)

Chrome - 2013 年 3 月 1 日金曜日 00:00:00 GMT+0000 (GMT 標準時)

「より不正確な」日付を使用した同じテスト:

var parsedDate = new Date("32 Aug 2013");

ブラウザーごとに次の Date オブジェクトを返します。

IE9 - 2012 年 9 月 1 日火曜日 00:00:00 UTC+0100

Safari - 無効な日付

Chrome - 無効な日付

NB IE はより寛大で柔軟なようです!

提案されたソリューションは、解析された月が予想される月と同じであることを確認するだけです。そうでない場合は、日付の追加が行われたと結論付けることができ、検証メッセージをスローする必要があります。

function dateIsValid(dateString) {
            
     var month = dateString.split(" ")[1],
         year =  dateString.split(" ")[2];
            
     var parsedDate = new Date(dateString);
                    
     // create a date object with the day defaulted to 01
     var expectedMonth = new Date("01 " + month + " " + year);
            
     // if the month was changed by the Date constructor we can deduce that the date is invalid!
     if (parsedDate.getMonth() === expectedMonth.getMonth()) {
          return true;
     }
            
     return false;
}

以下を実行すると、ブラウザ間で一貫した結果が得られます。

console.log(dateIsValid("01 Aug 2009")); // returns true
console.log(dateIsValid("56 Aug 2009")); // returns false
console.log(dateIsValid("29 Feb 2012")); // returns true
console.log(dateIsValid("29 Feb 2013")); // returns false

免責事項:もちろん、これは回避策です。しかし、それは簡単で、私のシナリオではうまくいきます!

于 2012-08-15T19:42:13.597 に答える
1

正規表現を使用して日付の形式を検証し、それが有効な日付である場合は、そこから日付オブジェクトを作成できます。

于 2012-08-14T16:32:15.210 に答える
1

とても興味深い結果です。IE9 は期待どおり として解析しているようAug 2009で、文字列 ( ) の最初の部分をこの日付にAugust 1, 2009追加します。56

August 1, 2009 + 56 days = September 25, 2009

1 月32日が 2 月 1 日だと言っているようなものです。これは設計上の決定のようです。他の日付形式を解析しようとすると、同じ動作が得られます。

console.log(new Date("08/32/2009")); // August 32, 2009
// LOG: Tue Sep 1 00:00:00 UTC+0100 2009

そのため、カスタム正規表現を使用して日付を検証するか、IE9でこの問題を解決することができます。

于 2012-08-14T16:37:33.250 に答える