アップデート2019-07-29:以下の既存のコンテンツは削除しませんが、この方法は使用しないことを強くお勧めします。私は自分の過ちから学びました。JavaScriptの既存のメソッドをオーバーライドしないでください。コードの移植性とパフォーマンスが低下します。ISO 8601(JSおよびほとんどのAPIの標準的な方法)を取得できない場合は、代わりにそのシステムを変更してください。または、オブジェクトを生成するために常に呼び出す必要がある独自の関数を記述しますDate
。
REST APIを修正して、適切なISO 8601日付時刻を送信できる場合、これを処理する適切な方法は、すべてのブラウザーがISO8601日付を処理できるようにする正規表現シムを使用することです。確かに遅いかもしれませんが、Javascriptで日付を処理することは、猫を水槽に入れようとするようなものです。
次のメソッドは、元のDate.parseメソッドをオーバーライドすることに注意してください。これは、大規模なプロジェクトや、さまざまな期待を持つ多くの開発者にとって問題になる可能性があります。自分が何をしているのかを知っている場合にのみ使用してください。
/**
* Date.parse with progressive enhancement for ISO 8601 <https://github.com/csnover/js-iso8601>
* © 2011 Colin Snover <http://zetafleet.com>
* Released under MIT license.
*/
(function (Date, undefined) {
var origParse = Date.parse, numericKeys = [ 1, 4, 5, 6, 7, 10, 11 ];
Date.parse = function (date) {
var timestamp, struct, minutesOffset = 0;
// ES5 §15.9.4.2 states that the string should attempt to be parsed as a Date Time String Format string
// before falling back to any implementation-specific date parsing, so that’s what we do, even if native
// implementations could be faster
// 1 YYYY 2 MM 3 DD 4 HH 5 mm 6 ss 7 msec 8 Z 9 ± 10 tzHH 11 tzmm
if ((struct = /^(\d{4}|[+\-]\d{6})(?:-(\d{2})(?:-(\d{2}))?)?(?:T(\d{2}):(\d{2})(?::(\d{2})(?:\.(\d{3}))?)?(?:(Z)|([+\-])(\d{2})(?::(\d{2}))?)?)?$/.exec(date))) {
// avoid NaN timestamps caused by “undefined” values being passed to Date.UTC
for (var i = 0, k; (k = numericKeys[i]); ++i) {
struct[k] = +struct[k] || 0;
}
// allow undefined days and months
struct[2] = (+struct[2] || 1) - 1;
struct[3] = +struct[3] || 1;
if (struct[8] !== 'Z' && struct[9] !== undefined) {
minutesOffset = struct[10] * 60 + struct[11];
if (struct[9] === '+') {
minutesOffset = 0 - minutesOffset;
}
}
timestamp = Date.UTC(struct[1], struct[2], struct[3], struct[4], struct[5] + minutesOffset, struct[6], struct[7]);
}
else {
timestamp = origParse ? origParse(date) : NaN;
}
return timestamp;
};
}(Date));
https://github.com/csnover/js-iso8601