Estou dando meu primeiro acesso ao Ajax com jQuery. Estou colocando meus dados em minha página, mas estou tendo problemas com os dados JSON retornados para os tipos de dados Date. Basicamente, estou recebendo uma string de volta que fica assim:
/Date(1224043200000)/
De alguém totalmente novo para o JSON - Como formatar isso para um formato de data curto? Isso deve ser tratado em algum lugar do código jQuery? Eu tentei ojQuery.UI.datepicker
plugin usando $.datepicker.formatDate()
sem sucesso.
FYI: Aqui está a solução que eu encontrei usando uma combinação das respostas aqui:
function getMismatch(id) {
$.getJSON("Main.aspx?Callback=GetMismatch",
{ MismatchId: id },
function (result) {
$("#AuthMerchId").text(result.AuthorizationMerchantId);
$("#SttlMerchId").text(result.SettlementMerchantId);
$("#CreateDate").text(formatJSONDate(Date(result.AppendDts)));
$("#ExpireDate").text(formatJSONDate(Date(result.ExpiresDts)));
$("#LastUpdate").text(formatJSONDate(Date(result.LastUpdateDts)));
$("#LastUpdatedBy").text(result.LastUpdateNt);
$("#ProcessIn").text(result.ProcessIn);
}
);
return false;
}
function formatJSONDate(jsonDate) {
var newDate = dateFormat(jsonDate, "mm/dd/yyyy");
return newDate;
}
Essa solução pegou meu objeto no método de retorno de chamada e exibiu as datas na página corretamente usando a biblioteca de formatos de data.
Date
.Respostas:
eval()
não é necessário. Isso funcionará bem:A
substr()
função retira a/Date(
peça, e aparseInt()
função obtém o número inteiro e ignora o)/
no final. O número resultante é passado para oDate
construtor.Eu intencionalmente deixei de fora a raiz (o segundo argumento para
parseInt
); veja meu comentário abaixo .Além disso, concordo totalmente com o comentário de Rory : as datas ISO-8601 são preferidas a esse formato antigo - portanto, esse formato geralmente não deve ser usado para novos desenvolvimentos. Veja a excelente biblioteca Json.NET para uma ótima alternativa que serializa datas usando o formato ISO-8601.
Para datas JSON no formato ISO-8601, basta passar a string para o
Date
construtor:fonte
Você pode usar isso para obter uma data em JSON:
E então você pode usar um script JavaScript Date Format (1,2 KB quando minificado e compactado com gzip) para exibi-lo como desejar.
fonte
jsonDate = new Date(+jsonDate.replace(/\/Date\((\d+)\)\//, '$1'));
new Function
é quase tão ruim quantoeval
: dev.opera.com/articles/view/efficient-javascript/…Para quem usa o Newtonsoft Json.NET , leia como fazê-lo via JSON nativo no IE8, Firefox 3.5 e Json.NET .
Também é útil a documentação sobre como alterar o formato das datas escritas pelo Json.NET: Serializando datas com o Json.NET
Para aqueles que são preguiçosos, aqui estão os passos rápidos. Como o JSON tem uma implementação frouxa de DateTime, você precisa usar o
IsoDateTimeConverter()
. Observe que, desde o Json.NET 4.5, o formato padrão da data é ISO, portanto o código abaixo não é necessário.O JSON será apresentado como
Por fim, algum JavaScript para converter a data ISO em uma data JavaScript:
Eu usei assim
fonte
new Date("2009-04-12T20:44:55")
+a[1]
etc representa as partes da matriz do regex e a+
converteria em um número, então+a[1]
é igual a2009
etc. Aqui está a divisão da matriz:0: "2009-04-12T20:44:55" 1: "2009" 2: "04" 3: "12" 4: "20" 5: "44" 6: "55"
O exemplo original:
não reflete a formatação usada pelo WCF ao enviar datas via WCF REST usando a serialização JSON integrada. (pelo menos no .NET 3.5, SP1)
Eu achei a resposta aqui útil, mas é necessária uma pequena edição no regex, pois parece que o deslocamento GMT do fuso horário está sendo anexado ao número retornado (desde 1970) no WCF JSON.
Em um serviço WCF, tenho:
ApptVisitLinkInfo é definido simplesmente:
Quando "Field2" é retornado como Json do serviço, o valor é:
Observe o deslocamento do fuso horário incluído como parte do valor.
O regex modificado:
É um pouco mais ansioso e pega tudo entre parênteses, não apenas o primeiro número. O tempo resultante desde 1970, mais o deslocamento do fuso horário podem ser alimentados no eval para obter um objeto de data.
A linha resultante de JavaScript para a substituição é:
fonte
Não se repita - automatize a conversão de datas usando
$.parseJSON()
As respostas à sua postagem fornecem a conversão manual de datas para datas JavaScript. Estendi o jQuery
$.parseJSON()
apenas um pouco, para poder analisar automaticamente as datas quando você o instruir. Ele processa datas formatadas em ASP.NET (/Date(12348721342)/
) e datas formatadas em ISO (2010-01-01T12.34.56.789Z
) suportadas por funções JSON nativas em navegadores (e bibliotecas como json2.js).De qualquer forma. Se você não quiser repetir seu código de conversão de datas repetidamente, sugiro que você leia esta postagem do blog e obtenha o código que facilitará sua vida.
fonte
Se você diz em JavaScript,
você verá que é a data correta e pode usá-la em qualquer lugar do código JavaScript com qualquer estrutura.
fonte
Clique aqui para conferir a demonstração
JavaScript / jQuery
Resultado - "15/10/2008"
fonte
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, como2014-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
2) Detectar formato de data ISO
3) Analisar formato de data do MS:
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:
4b) Analise o formato ISO com três casas decimais fixas de três milissegundos - muito mais fácil:
5) Formate-o:
6) Amarre tudo junto:
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:
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.
fonte
Não há um tipo de data interno no JSON . Parece o número de segundos / milissegundos de alguma época. Se você conhece a época, pode criar a data adicionando a quantidade certa de tempo.
fonte
Também tive que procurar uma solução para esse problema e, finalmente, me deparei com o moment.js, que é uma boa biblioteca que pode analisar esse formato de data e muito mais.
Isso me salvou de dor de cabeça, então pensei em compartilhar com você. :)
Você pode encontrar mais algumas informações sobre isso aqui: http://momentjs.com/
fonte
Acabei adicionando os "caracteres à expressão regular do Panos para nos livrarmos dos gerados pelo serializador da Microsoft ao escrever objetos em um script embutido:
Portanto, se você tem uma propriedade em seu código C # por trás, é algo como
E no seu aspx você tem
Você receberia algo como
Observe as aspas duplas.
Para obter isso em um formulário que eval deserialize corretamente, usei:
Eu uso Prototype e para usá-lo eu adicionei
fonte
No jQuery 1.5, desde que você tenha o json2.js para navegadores mais antigos, é possível desserializar todas as datas provenientes do Ajax da seguinte maneira:
Incluí uma lógica que supõe que você envie todas as datas do servidor como UTC (o que você deveria); o consumidor recebe um
Date
objeto JavaScript com o valor de ticks adequado para refletir isso. Ou seja, chamargetUTCHours()
etc. na data retornará o mesmo valor que no servidor e chamargetHours()
retornará o valor no fuso horário local do usuário, conforme determinado pelo navegador.Isso não leva em conta o formato WCF com deslocamentos de fuso horário, embora isso seja relativamente fácil de adicionar.
fonte
Usando o datepicker da interface do usuário do jQuery - realmente só faz sentido se você já estiver incluindo a interface do usuário do jQuery:
resultado:
fonte
Não pense demais nisso. Como fizemos por décadas, passe um deslocamento numérico da época padrão de fato de 1 de janeiro de 1970 à meia-noite GMT / UTC / & c em número de segundos (ou milissegundos) desde essa época. JavaScript gosta, Java gosta, C gosta e a Internet gosta.
fonte
Todas essas respostas têm uma coisa em comum: todas elas armazenam datas como um valor único (geralmente uma string).
Outra opção é aproveitar a estrutura inerente do JSON e representar uma data como lista de números:
Obviamente, você precisaria garantir que os dois lados da conversa concordassem com o formato (ano, mês, dia) e quais campos deveriam ser datas, ... mas isso tem a vantagem de evitar completamente a questão da data conversão para string. São todos os números - sem nenhuma string. Além disso, o uso da ordem: ano, mês, dia também permite a classificação correta por data.
Apenas pensando fora da caixa aqui - uma data JSON não precisa ser armazenada como uma string.
Outro bônus a fazer dessa maneira é que você pode selecionar (de maneira fácil e eficiente) todos os registros para um determinado ano ou mês, aproveitando a maneira como o CouchDB lida com consultas sobre valores de matriz.
fonte
Postagem em tópico impressionante:
fonte
Apenas para adicionar outra abordagem aqui, a "abordagem de ticks" adotada pelo WCF é propensa a problemas com fusos horários, se você não for extremamente cuidadoso, como descrito aqui e em outros lugares. Portanto, agora estou usando o formato ISO 8601 que .NET e JavaScript suportam devidamente, incluindo compensações de fuso horário. Abaixo estão os detalhes:
No WCF / .NET:
Onde CreationDate é um System.DateTime; ToString ("o") está usando o especificador de formato de ida e volta do .NET que gera uma string de data compatível com ISO 8601
Em JavaScript
Logo após recuperar o JSON, corrigi as datas para serem objetos JavaSript Date usando o construtor Date, que aceita uma string de data ISO 8601 ...
Depois de ter uma data JavaScript, você pode usar todos os métodos Date, convenientes e confiáveis, como toDateString , toLocaleString , etc.
fonte
Existe outra opção sem usar a biblioteca jQuery?
fonte
Isso também pode ajudá-lo.
fonte
Abaixo está uma solução bastante simples para analisar datas JSON. Use as funções abaixo conforme sua exigência. Você só precisa passar o formato JSON Data buscado como parâmetro para as funções abaixo:
fonte
Você também pode usar a biblioteca JavaScript moment.js , que é útil quando você planeja lidar com diferentes formatos localizados e executar outras operações com valores de datas:
Configurar a localização é tão fácil quanto adicionar arquivos de configuração (você os encontra em momentjs.com) ao seu projeto e configurar o idioma:
fonte
Recebo a data assim:
Em alguns exemplos, a data está em formatos ligeiramente diferentes:
etc.
Então, eu vim com o seguinte RegExp:
e o código final é:
Espero que ajude.
Atualização: Encontrei este link da Microsoft: Como serializar datas com JSON?
Parece que é o que estamos procurando.
fonte
Verifique a data do padrão ISO; mais ou menos assim:
Torna-se
2008.11.20T22:18
.fonte
Isso é frustrante. Minha solução foi analisar o "/ e /" do valor gerado pelo JavaScriptSerializer do ASP.NET para que, embora o JSON possa não ter uma data literal, ele ainda seja interpretado pelo navegador como uma data, que é tudo o que realmente quer:
{"myDate":Date(123456789)}
JavaScriptConverter personalizado para DateTime?
Devo enfatizar a precisão do comentário de Roy Tinker. Isso não é JSON legal. É um truque sujo no servidor para remover o problema antes que ele se torne um problema para JavaScript. Isso bloqueará um analisador JSON. Usei-o para decolar, mas não uso mais isso. No entanto, ainda sinto que a melhor resposta está em alterar a forma como o servidor formata a data, por exemplo, ISO, conforme mencionado em outro lugar.
fonte
Um post atrasado, mas para aqueles que pesquisaram este post.
Imagina isto:
Como você pode ver, estou utilizando o recurso do C # 3.0 para criar os genéricos "Auto". É um pouco preguiçoso, mas eu gosto e funciona. Apenas uma observação: o perfil é uma classe personalizada que criei para o meu projeto de aplicativo da web.
fonte
Para sua informação, para quem usa Python no lado do servidor: datetime.datetime (). Ctime () retorna uma string que é nativamente analisável por "new Date ()". Ou seja, se você criar uma nova instância datetime.datetime (como datetime.datetime.now), a cadeia poderá ser incluída na cadeia JSON e, em seguida, essa cadeia poderá ser passada como o primeiro argumento para o construtor Date. Ainda não encontrei nenhuma exceção, mas também não a testei com rigor.
fonte
Solução Mootools:
Requer mais mootools. Testado usando o mootools-1.2.3.1-more no Firefox 3.6.3 e IE 7.0.5730.13
fonte
fonte
Adicione o plugin jQuery UI à sua página:
fonte
E se o .NET retornar ...
E então em JavaScript ...
fonte