Convertendo o .NET DateTime em JSON

Duplicar Possível:
Como formatar uma data JSON?

Meu serviço da web está retornando um DateTime para uma chamada do jQuery. O serviço retorna os dados neste formato:

/Date(1245398693390)/ 

Como posso converter isso em uma data amigável para JavaScript?

O que é retornado é milissegundos desde a época. Você poderia fazer:

 var d = new Date(); d.setTime(1245398693390); document.write(d); 

Sobre como formatar a data exatamente como você deseja, consulte a referência de Date completa em http://www.w3schools.com/jsref/jsref_obj_date.asp

Você pode retirar os não-dígitos analisando o inteiro ( como sugerido aqui ):

 var date = new Date(parseInt(jsonDate.substr(6))); 

Ou aplicando a seguinte expressão regular (da Tominator nos comentários):

 var jsonDate = jqueryCall(); // returns "/Date(1245398693390)/"; var re = /-?\d+/; var m = re.exec(jsonDate); var d = new Date(parseInt(m[0])); 

Eu tenho usado este método por um tempo:

 using System; public static class ExtensionMethods { // returns the number of milliseconds since Jan 1, 1970 (useful for converting C# dates to JS dates) public static double UnixTicks(this DateTime dt) { DateTime d1 = new DateTime(1970, 1, 1); DateTime d2 = dt.ToUniversalTime(); TimeSpan ts = new TimeSpan(d2.Ticks - d1.Ticks); return ts.TotalMilliseconds; } } 

Supondo que você esteja desenvolvendo contra o .NET 3.5, é uma cópia / colagem direta. Você pode portá-lo.

Você pode encapsular isso em um object JSON ou simplesmente gravá-lo no stream de resposta.

No lado Javascript / JSON, você converte isso em uma data simplesmente passando os ticks para um novo object Date:

 jQuery.ajax({ ... success: function(msg) { var d = new Date(msg); } } 

Para analisar a string de data usando String.replace com backreference:

 var milli = "/Date(1245398693390)/".replace(/\/Date\((-?\d+)\)\//, '$1'); var d = new Date(parseInt(milli)); 

Se você passar um DateTime de um código .Net para um código javascript, C #:

 DateTime net_datetime = DateTime.Now; 

javascript trata-o como uma string, como "/Date(1245398693390)/" :

Você pode convertê-lo como fllowing:

 // convert the string to date correctly var d = eval(net_datetime.slice(1, -1)) 

ou:

 // convert the string to date correctly var d = eval("/Date(1245398693390)/".slice(1, -1)) 

Se você está tendo problemas para acessar as informações de tempo, pode tentar algo assim:

  d.date = d.date.replace('/Date(', ''); d.date = d.date.replace(')/', ''); var expDate = new Date(parseInt(d.date)); 

a conversão de 1970,1,1 precisa do dobro arredondado para zero casas decimais eu acho

 DateTime d1 = new DateTime(1970, 1, 1); DateTime d2 = dt.ToUniversalTime(); TimeSpan ts = new TimeSpan(d2.Ticks - d1.Ticks); return Math.Round( ts.TotalMilliseconds,0); 

no lado do cliente eu uso

 new Date(+data.replace(/\D/g, '')); 

http://stevenlevithan.com/assets/misc/date.format.js

 var date = eval(data.Data.Entity.Slrq.replace(/\/Date\((\d )\)\//gi, "new Date($1)")); alert(date.format("yyyy-MM-dd HH:mm:ss")); alert(dateFormat(date, "yyyy-MM-dd HH:mm:ss")); 

Você pode experimentar uma biblioteca de terceiros, como json.net. Há uma documentação no site do projeto. Diz que requer .net 3.5.

Caso contrário, há outro chamado Nii.json, que eu acredito ser uma porta do java. Eu encontrei um link para ele neste blog

Todas as respostas anteriores afirmam que você pode fazer o seguinte:

 var d = eval(net_datetime.slice(1, -1)); 

No entanto, isso não funciona no Chrome ou no FF porque o que está sendo avaliado literalmente é:

 // returns the current timestamp instead of the specified epoch timestamp var d = Date([epoch timestamp]); 

A maneira correta de fazer isso é:

 var d = eval("new " + net_datetime.slice(1, -1)); // which parses to var d = new Date([epoch timestamp]); 

Pensei em adicionar minha solução que estou usando.

Se você estiver usando o System.Web.Script.Serialization.JavaScriptSerializer() , a hora retornada não será específica para o seu fuso horário. Para corrigir isso, você também vai querer usar o dte.getTimezoneOffset() para recuperá-lo na hora correta.

 String.prototype.toDateFromAspNet = function() { var dte = eval("new " + this.replace(/\//g, '') + ";"); dte.setMinutes(dte.getMinutes() - dte.getTimezoneOffset()); return dte; } 

agora você só vai ligar

 "/Date(1245398693390)/".toDateFromAspNet(); 

Sex 19 Jun 2009 00:04:53 GMT-0400 (Horário de Verão do Leste) {}