Короче говоря, это почти невозможно обещание сделать как реализация является UA зависит. Я бы рекомендовал использовать iso8601 формат, как это будет стандартным идти вперед и использовать подкладку, чтобы помочь в дате разборе здесь, я написал для собственного использования:
(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(....)
и все будут счастливы в земле ОЗ!
работает во всех основных браузерах, использовали эти ссылки:
http://dev.w3.org/html5/spec/common-microsyntaxes.html
http://www.ecma-international.org/ecma-262/5.1/#sec-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
https://connect.microsoft.com/IE/feedback/details/723740/date-parse-and-new-date-fail-on-valid-formats
надеюсь, что это помогает -ck
UPDATE: (1/21/2013)
Следует отметить, что поведение, что считается "стандартами поведения" собирается перейти от ECMAScript-262 v5.1 к ECMAScript-262 v6.0. См .:
Язык переведен с: Значение смещения по часовой стрелке отсутствует «Z».доЕсли смещение часового пояса отсутствует, дата-время интерпретируется как местное время.
В настоящее время рассол: хромовое, опера и мобильное сафари следуют за ES5.1, тогда как IE10, firefox и настольные сафари, похоже, следуют за ES6. Так что это своего рода раздельного решения прямо сейчас ... Так как таковые должно быть вторым ES6 стандартом-совместимого вариантом этого сценария, и здесь я пойти:
(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);
};
})();
Я думаю, что было бы лучше и более стабильным (в долгосрочной перспективе, например, если появляется какой-то сумасшедший браузер или изменения спецификации) использовать некоторый пользовательский формат, вручную разбить его и передать его другой конструктор даты. – bezmax
Где дата, начиная с? У вас есть контроль над экспортом разделов даты для передачи в конструкцию? Конструкция Date может принимать год, месяц, день, а также использовать такие методы, как 'setHours',' setMonth' и т. Д. –
Думайте, что вам, возможно, придется написать свой собственный, использовать параметр конструктора миллисекунд или использовать что-то вроде http: //www.datejs.com/. –