11

セッションストレージで使用するために、日付から文字列への変換を行っています。だから私は最初にこれを行います:

sessionStorage.currentDate = myDate.toJSON();

そして、私はこれを行います:

if (sessionStorage.currentDate ) {
    myDate = new Date(sessionStorage.currentDate);
}

問題は、 IE9+myDate.toJSON()の関数は戻りますが、IE8 では最後の小数部分が欠落していることです。"2013-05-06T22:00:00.000Z""2013-05-06T22:00:00Z"

事実は、IE8 ではその後の日付への再変換に失敗しているということです (からの結果new Date(sessionStorage.currentDate)NaN)

なぜこれが起こっているのか、このコードを IE8+ で機能させる方法はありますか?

アップデート:

デバッグで文字列を置き換えようとしましたが、2 つの文字列のいずれも機能しないことがわかりました。したがって、実際にnew Date(sessionStorage.currentDate)はフォーマット(UTC)を認識しないという問題のようです

4

3 に答える 3

12

ES5 より前は、日付の解析は完全に実装に依存していました。IE 8 (およびそれ以前) は ES5 で指定された ISO 8601 形式を解析しないため、自分で解析してください:

// parse ISO format date like 2013-05-06T22:00:00.000Z
function dateFromISO(s) {
  s = s.split(/\D/);
  return new Date(Date.UTC(s[0], --s[1]||'', s[2]||'', s[3]||'', s[4]||'', s[5]||'', s[6]||''))
}

文字列が UTC であると仮定します。

于 2013-07-11T12:31:33.773 に答える
2

場所の数が異なるのは、何かが「機能していない」場合ではないと思います。https://en.wikipedia.org/wiki/ISO_8601#Timesから:

小数部は、3 つの時間要素のいずれにも追加できます。[...] 分数は、表現の最下位の時間要素にのみ追加できます。「14 時間 30 分 30 分」を表すには、秒の数字を含めないでください。"14:30,5"、"1430,5"、"14:30.5"、または "1430.5" として表します。小数の小数点以下の桁数に制限はありません。ただし、小数点以下の桁数については、通信当事者間で合意する必要があります。

したがって、 toJSON は時間を ISO-8601 形式に変換し、言及した両方の文字列が有効な ISO-8601 であるため、両方が正しいように見えます-たまたま異なるだけです。

修正に関しては、単純な正規表現の置換でうまくいくはずです - すべての一致\.\d+Zを justに置き換えますZ(ミリ秒レベルの精度は必要ないと思います!)。これにより、IE9 から生成されたものであっても IE8 で動作する文字列が得られるはずです。

于 2013-07-11T12:06:03.710 に答える
-2

これにはIE8固有のブラウザハックが必要だと思います。そして、これには次のような追加のコードが必要です...

if(jQuery.browser.msie && jQuery.browser.version.substring(0, 1) == 8) {
    // add extra missing zero
}
于 2013-07-11T12:05:48.727 に答える