Я говорю, что шим это только при необходимости через несколько тестов,
вот тот, который я уже написал:
(function() {
var d = window.Date,
regexIso8601 = /^(\d{4}|\+\d{6})(?:-(\d{2})(?:-(\d{2})(?:T(\d{2}):(\d{2}):(\d{2})\.(\d{1,3})(?:Z|([\-+])(\d{2}):(\d{2}))?)?)?)?$/;
if (d.parse('2011-11-29T15:52:30.5') !== 1322581950500 ||
d.parse('2011-11-29T15:52:30.52') !== 1322581950520 ||
d.parse('2011-11-29T15:52:18.867') !== 1322581938867 ||
d.parse('2011-11-29T15:52:18.867Z') !== 1322581938867 ||
d.parse('2011-11-29T15:52:18.867-03:30') !== 1322594538867 ||
d.parse('2011-11-29') !== 1322524800000 ||
d.parse('2011-11') !== 1320105600000 ||
d.parse('2011') !== 1293840000000) {
d.__parse = d.parse;
d.parse = function(v) {
var m = regexIso8601.exec(v);
if (m) {
return Date.UTC(
m[1],
(m[2] || 1) - 1,
m[3] || 1,
m[4] - (m[8] ? m[8] + m[9] : 0) || 0,
m[5] - (m[8] ? m[8] + m[10] : 0) || 0,
m[6] || 0,
((m[7] || 0) + '00').substr(0, 3)
);
}
return d.__parse.apply(this, arguments);
};
}
d.__fromString = d.fromString;
d.fromString = function(v) {
if (!d.__fromString || regexIso8601.test(v)) {
return new d(d.parse(v));
}
return d.__fromString.apply(this, arguments);
};
})();
и в вашем коде просто всегда используйте Date.fromString(...)
вместо new Date(...)
проверить браузер, чтобы увидеть, будет ли использоваться прокладка:
http://jsbin.com/efivib/1/edit
работает во всех основных браузерах, используются следующие ссылки:
http://dev.w3.org/html5/spec/common-microsyntaxes.html
http://www.ecma -international.org / ECMA-262 / 5,1 / # втор-15.9.1.15
http://msdn.microsoft.com/en-us/library/windows/apps/ff743760(v=vs.94).aspx
http://msdn.microsoft.com/en-us/library/windows/apps/wz6stk2z(v=vs.94).aspx
http://msdn.microsoft.com/en-us/library/windows/apps/k4w173wk(v=vs.94).aspx
! - для подключения к Microsoft требуется войти в систему:
IE9 не работал в миллисекундах с количеством цифр, отличным от 3: (исправлено в IE10)
https://connect.microsoft.com/IE/feedback/details/723740/date-parse-and-new-date-fail-on-valid-formats
IE10 по-прежнему (по состоянию на 17.01.2013) не работает, если часовой пояс пропущен (в соответствии с ECMA это должно иметь значение Z или UTC, а не локальное):
https://connect.microsoft.com/IE/feedback/details/776783/date-parse-and-new-date-fail-on-valid-formats
- Прочтите это, если вам небезразлично, где сейчас находится / будет действовать стандарт, и почему я не могу заставить команду IE признать, что их реализация IE10 технически неверна:
ECMAScript-262 v6.0 собирается перейти на немного более совместимую с iso8601 версию «если индикатор часового пояса опущен, предположить местное время» ... так что теперь есть расхождение, эта реализация, chrome, мобильное сафари и Opera все следуют ECMAScript-262 v5.1, в то время как IE10, firefox, десктопное сафари все, похоже, следуют более совместимой со стандартом ISO601 ECMAScript-262 v6.0 спецификации ... это, по меньшей мере, запутанно Когда chrome или мобильное сафари нажимают на триггер и переходят к реализации ES6, я думаю, что эта реализация должна идти с ним, оставляя ES5.1 в меньшинстве. Я читал, что это перечислено в "опечатках" версии 5.1, хотя я не нашел это. Я придерживаюсь мнения, что пока еще рано нажимать на ES6, но я также придерживаюсь мнения, что код должен быть практичным, а не идеальным и двигаться туда, куда переходят создатели браузера. Тем не менее, сейчас кажется, что решение 50/50, поэтому ниже приведена «будущая» версия этого кода ...
Я должен также упомянуть, что любая версия кода нормализует «несовместимые» браузеры, чтобы соответствовать поведению другого, так как это то, что делают shims;)
ЗДЕСЬ АДАПТИРОВАННАЯ ВЕРСИЯ, СОВМЕСТИМАЯ С ECMAScript-262 v6.0 (JavaScript Future)
см. Соответствующие разделы здесь: (это единственная онлайн-версия спецификации, которую я смог найти) http://people.mozilla.org/~jorendorff/es6-draft.html#sec-15.9.1.15
(function() {
var d = window.Date,
regexIso8601 = /^(\d{4}|\+\d{6})(?:-(\d{2})(?:-(\d{2})(?:T(\d{2}):(\d{2}):(\d{2})\.(\d{1,})(Z|([\-+])(\d{2}):(\d{2}))?)?)?)?$/,
lOff, lHrs, lMin;
if (d.parse('2011-11-29T15:52:30.5') !== 1322599950500 ||
d.parse('2011-11-29T15:52:30.52') !== 1322599950520 ||
d.parse('2011-11-29T15:52:18.867') !== 1322599938867 ||
d.parse('2011-11-29T15:52:18.867Z') !== 1322581938867 ||
d.parse('2011-11-29T15:52:18.867-03:30') !== 1322594538867 ||
d.parse('2011-11-29') !== 1322524800000 ||
d.parse('2011-11') !== 1320105600000 ||
d.parse('2011') !== 1293840000000) {
d.__parse = d.parse;
lOff = -(new Date().getTimezoneOffset());
lHrs = Math.floor(lOff / 60);
lMin = lOff % 60;
d.parse = function(v) {
var m = regexIso8601.exec(v);
if (m) {
return Date.UTC(
m[1],
(m[2] || 1) - 1,
m[3] || 1,
m[4] - (m[8] ? m[9] ? m[9] + m[10] : 0 : lHrs) || 0,
m[5] - (m[8] ? m[9] ? m[9] + m[11] : 0 : lMin) || 0,
m[6] || 0,
((m[7] || 0) + '00').substr(0, 3)
);
}
return d.__parse.apply(this, arguments);
};
}
d.__fromString = d.fromString;
d.fromString = function(v) {
if (!d.__fromString || regexIso8601.test(v)) {
return new d(d.parse(v));
}
return d.__fromString.apply(this, arguments);
};
})();
надеюсь, это поможет -ck