Atualizada
Temos uma biblioteca de interface do usuário interna que precisa lidar com o formato JSON interno do ASP.NET da Microsoft, como /Date(msecs)/
perguntado aqui originalmente, e com o formato de data da maioria dos JSON, incluindo o JSON.NET, como 2014-06-22T00:00:00.0
. Além disso, precisamos lidar com a incapacidade do oldIE de lidar com qualquer coisa, exceto três casas decimais .
Primeiro detectamos que tipo de data estamos consumindo, analisamos em um JavaScript normal Date
objeto , em seguida, formata-o.
1) Detectar o formato Microsoft Date
// Handling of Microsoft AJAX Dates, formatted like '/Date(01238329348239)/'
function looksLikeMSDate(s) {
return /^\/Date\(/.test(s);
}
2) Detectar formato de data ISO
var isoDateRegex = /^(\d\d\d\d)-(\d\d)-(\d\d)T(\d\d):(\d\d):(\d\d)(\.\d\d?\d?)?([\+-]\d\d:\d\d|Z)?$/;
function looksLikeIsoDate(s) {
return isoDateRegex.test(s);
}
3) Analisar formato de data do MS:
function parseMSDate(s) {
// Jump forward past the /Date(, parseInt handles the rest
return new Date(parseInt(s.substr(6)));
}
4) Analise o formato da data ISO.
Temos pelo menos uma maneira de ter certeza de que estamos lidando com datas ISO padrão ou datas ISO modificadas para sempre ter três locais de milissegundos ( veja acima ), portanto, o código é diferente dependendo do ambiente.
4a) Analisar o formato padrão de data ISO, lidar com os problemas do oldIE:
function parseIsoDate(s) {
var m = isoDateRegex.exec(s);
// Is this UTC, offset, or undefined? Treat undefined as UTC.
if (m.length == 7 || // Just the y-m-dTh:m:s, no ms, no tz offset - assume UTC
(m.length > 7 && (
!m[7] || // Array came back length 9 with undefined for 7 and 8
m[7].charAt(0) != '.' || // ms portion, no tz offset, or no ms portion, Z
!m[8] || // ms portion, no tz offset
m[8] == 'Z'))) { // ms portion and Z
// JavaScript's weirdo date handling expects just the months to be 0-based, as in 0-11, not 1-12 - the rest are as you expect in dates.
var d = new Date(Date.UTC(m[1], m[2]-1, m[3], m[4], m[5], m[6]));
} else {
// local
var d = new Date(m[1], m[2]-1, m[3], m[4], m[5], m[6]);
}
return d;
}
4b) Analise o formato ISO com três casas decimais fixas de três milissegundos - muito mais fácil:
function parseIsoDate(s) {
return new Date(s);
}
5) Formate-o:
function hasTime(d) {
return !!(d.getUTCHours() || d.getUTCMinutes() || d.getUTCSeconds());
}
function zeroFill(n) {
if ((n + '').length == 1)
return '0' + n;
return n;
}
function formatDate(d) {
if (hasTime(d)) {
var s = (d.getMonth() + 1) + '/' + d.getDate() + '/' + d.getFullYear();
s += ' ' + d.getHours() + ':' + zeroFill(d.getMinutes()) + ':' + zeroFill(d.getSeconds());
} else {
var s = (d.getMonth() + 1) + '/' + d.getDate() + '/' + d.getFullYear();
}
return s;
}
6) Amarre tudo junto:
function parseDate(s) {
var d;
if (looksLikeMSDate(s))
d = parseMSDate(s);
else if (looksLikeIsoDate(s))
d = parseIsoDate(s);
else
return null;
return formatDate(d);
}
A resposta antiga abaixo é útil para vincular essa formatação de data à análise JSON do jQuery, para que você obtenha objetos Date em vez de strings, ou se ainda estiver preso no jQuery <1.5 de alguma forma.
Resposta antiga
Se você estiver usando a função Ajax do jQuery 1.4 com o ASP.NET MVC, poderá transformar todas as propriedades DateTime em objetos Date com:
// Once
jQuery.parseJSON = function(d) {return eval('(' + d + ')');};
$.ajax({
...
dataFilter: function(d) {
return d.replace(/"\\\/(Date\(-?\d+\))\\\/"/g, 'new $1');
},
...
});
No jQuery 1.5, você pode evitar a substituição parseJSON
global do método usando a opção conversores na chamada Ajax.
http://api.jquery.com/jQuery.ajax/
Infelizmente, você precisa mudar para a rota de avaliação mais antiga para fazer com que as Datas analisem globalmente no local - caso contrário, é necessário convertê-las mais caso a caso, após a análise.