2009-06-19 19 views
217

Duplicar posible:
How to format a JSON date?conversión de .NET DateTime a JSON

Mi servicio telas devuelve un DateTime a una llamada jQuery. El servicio devuelve los datos en este formato:

/Date(1245398693390)/ 

¿Cómo puedo convertir esto en una fecha compatible con JavaScript?

+0

Ver http://stackoverflow.com/questions/206384/how-to-format-a-json-date –

Respuesta

233

lo que se devuelve es milisegundos desde la época. Se podría hacer:

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

sobre cómo formatear la fecha exactamente como usted desea, Ir referencia Date en http://www.w3schools.com/jsref/jsref_obj_date.asp

que podría despojar a los no-dígitos por cualquiera de analizar el número entero (as suggested here):

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

o aplicando la siguiente expresión regular (de Tominator en los comentarios):

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

O simplemente var d = new Date (1245398693390); –

+23

Esto también será útil: var re =/-? \ D + /; var m = re.exec (json_date_string); var d = new Date (parseInt (m [0])); – Tominator

+6

¿cómo está analizando el "/ Fecha (" y simplemente agarrando el número? – leora

6

Puede probar una biblioteca de terceros como json.net. Hay documentos en el sitio del proyecto. Sí dice que requiere .net 3.5.

De lo contrario, hay otro llamado Nii.json que creo que es un puerto de Java. He encontrado un enlace a ella en this blog

77

He estado usando este método durante un tiempo:

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; 
    } 
} 

Suponiendo que está desarrollando en contra de .NET 3.5, que es una copia directa/pegar. De lo contrario, puedes portarlo.

Puede encapsular esto en un objeto JSON, o simplemente escribirlo en la secuencia de respuesta.

En el lado Javascript/JSON, que convertir esto en una fecha simplemente pasando las garrapatas en un nuevo objeto Date:

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

utilizo su código en C# .Net4 .0 para convertir las fechas de C# en JSON (REST), pero no me da la conversión correcta para las fechas de JS. Aquí hay un ejemplo del retorno de la conversión correcta por Json-Rest: C# date: 2009-09-12 00:00:00, es igual a JSdate: Date (1252684800000 + 0800). Su código me da un valor de: DATE (-28800000) que no es aceptable por json. ¿Cuál es su solución a esto? ... gracias – fiberOptics

+0

Cambiar el doble a la cadena con formato ToString ("#"). El doble puede devolver decimales e introducir un error en algunos casos – harveyt

+0

nueva Fecha (msg) no acepta una cadena. Así que no olvides parseInt (como en las otras respuestas en esta página). – Tillito

16

Si usted está teniendo problemas para llegar a la información de tiempo, puede intentar algo como esto:

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

puede omitir la segunda instrucción de reemplazo ya que 'parseInt ('1234abcd') devuelve 1234' en js – amd

16

Si pasa un DateTime de una.código de red para un código javascript, C#:

DateTime net_datetime = DateTime.Now; 

Javascript a lo trata como una cadena, como "/Date(1245398693390)/":

se puede convertir como fllowing:

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

o:

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

' eval' considerado nocivo. –

33

Para analizar la cadena de fecha usando String.replace con b ackreference:

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

Usar una expresión regular es exagerado para este ejemplo. Simplemente use 'new Date (parseInt (milli.substr (6)));' para comenzar a analizar en la parte numérica de la cadena. –

4

Pensé en agregar la solución que he estado usando.

Si está utilizando el System.Web.Script.Serialization.JavaScriptSerializer(), entonces el tiempo devuelto no será específico de su zona horaria. Para solucionarlo, también querrá usar dte.getTimezoneOffset() para volver a la hora correcta.

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

ahora voy a llamar

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

Vie Jun 19 de 2009 00:04:53 GMT-0400 (Hora de verano) {}

+3

'eval' considerado nocivo. –

+1

Tiene sus lugares. Creo que esta es la única instancia que lo he usado. En cuanto a las preocupaciones de seguridad, diría que está bien en este contexto porque no estamos extrayendo nada que sea públicamente modificable, como una cadena de consulta o un campo de formulario. Obviamente, cualquier persona con intenciones puede hacer lo que quiera, ya sea que se use eval o que no sea el script del cliente. – used2could

+0

Además de las preocupaciones de seguridad, 'eval' es ineficaz e impide que funcionen muchos optimizadores y minificadores de JavaScript. Si está utilizando 'eval' para algo más que el análisis JSON, probablemente haya una mejor manera de hacerlo. –

5

Las respuestas anteriores todos indican que puede hacer lo siguiente:

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

Sin embargo, esto no funciona, ya sea en cromo o FF, porque lo que está siendo evaluado literalmente es:

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

La forma correcta de hacerlo es:

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

var d = new Date([epoch timestamp]); 
+2

'eval' considerado dañino. –

+0

Me di cuenta de que esta versión proporcionaba el desplazamiento de la zona horaria: UTC ..... Ejemplo: mar 20 sep 09:44:41 EDT 2011. Otras versiones no tenían el "EDT". Gracias cowmoo – granadaCoder

10

la conversión de 1970,1,1 necesita el doble redondeado a cero lugares decimales creo

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); 

en el lado del cliente i utilizar

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

buen truco para la 'nueva Fecha (+ data.replace (/ \ D/g, ''));' – kite

Cuestiones relacionadas