¿Cómo puedo formatear una fecha JSON de Microsoft?

Estoy tomando mi primera oportunidad en Ajax con jQuery. Recibo mis datos en mi página, pero tengo algunos problemas con los datos JSON que se devuelven para los tipos de datos de fecha. Básicamente, obtengo una cadena que se ve así:

/Date(1224043200000)/

De alguien totalmente nuevo en JSON: ¿cómo le doy formato a esto a un formato de fecha corta? ¿Debería manejarse esto en algún lugar del código jQuery? He probado el jQuery.UI.datepicker complemento utilizando $.datepicker.formatDate() sin ningún éxito.

FYI: Aquí está la solución que se me ocurrió usando una combinación de las respuestas aquí:

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

Esta solución obtuvo mi objeto del método de devolución de llamada y mostró las fechas en la página correctamente utilizando la biblioteca de formato de fecha.

preguntado Oct 15 '08, 18:10

Esto puede resultar interesante: hanselman.com/blog/… -

El formato /Date(...)/ es específico del formato JSON Date incorporado de Microsoft; no forma parte de ningún estándar, y JSON, que proviene de Javascript, tiene un estándar: el formato ISO Javascript especifica: stackoverflow.com/a/15952652/176877 Entonces, esta pregunta es específica del formato de fecha JSON de Microsoft. Modifiqué el título para aclarar esto. -

¡Estás bromeando! ¡Microsoft ha marcado su propio giro en JSON! y en citas !! ¡Cuándo aprenderán! -

Use Newtonsoft JSON en el lado .NET y para tener buenos valores escritos en el lado JS, solo use: github.com/RickStrahl/json.date-extensions -

Puede usar JSON ++ en lugar de JSON. JSON ++ es lo mismo que JSON pero con soporte para tipos de JavaScript como Date. -

30 Respuestas

eval() no es necesario. Esto funcionará bien:

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

El substr() función saca el /Date( parte, y la parseInt() La función obtiene el número entero e ignora el )/ al final. El número resultante se pasa al Date constructor.


He omitido intencionalmente la raíz (el segundo argumento de parseInt); ver mi comentario a continuación.

Además, estoy completamente de acuerdo con El comentario de Rory: Se prefieren las fechas ISO-8601 sobre este formato antiguo, por lo que este formato generalmente no debe usarse para nuevos desarrollos. Ver lo excelente Json.NET biblioteca para una gran alternativa que serializa fechas usando el formato ISO-8601.

Para fechas JSON con formato ISO-8601, simplemente pase la cadena a la Date constructor:

var date = new Date(jsonDate); //no ugly parsing needed; full timezone support

contestado el 29 de mayo de 19 a las 18:05

@Broam: Ambos métodos (la función de reemplazo y esta respuesta) tendrían que cambiar si MS cambia el formato. - Roy Tinker

¿Podría actualizarlo con radix var date = new Date (parseInt (jsonDate.substr (6), 10)); - james kyburz

@JamesKyburz: Cada regla tiene excepciones, y creo que aquí es cuando se aplica una excepción. Los números de fecha JSON de .NET nunca tienen un "0" inicial, por lo que podemos omitir con seguridad la raíz. - Roy Tinker

Vale la pena señalar que este formato de fecha es bastante malo y el cambio general es a las fechas formateadas ISO-8601 en JSON. Ver hanselman.com/blog/… - Rory

Este enfoque no tiene en cuenta la zona horaria, por lo que puede causar problemas graves cuando su servidor y los usuarios se encuentran en zonas horarias diferentes. Publiqué una respuesta a continuación que explica una forma muy rápida y fácil de lidiar con esto en los lados de WCF y Javascript: stackoverflow.com/a/10743718/51061 - scott willeke

Puede usar esto para obtener una fecha de JSON:

var date = eval(jsonDate.replace(/\/Date\((\d+)\)\//gi, "new Date($1)"));

Y luego puedes usar un formato de fecha JavaScript script (1.2 KB cuando está minificado y comprimido con gzip) para mostrarlo como desee.

respondido 09 nov., 14:10

No hay nada de malo en la línea, la secuencia es \ //. La primera barra se escapa, por lo que no cuenta como un comentario. Es su editor el que lo está engañando, la línea funcionará bien. - andreialecu

@rball, tonterías: jsonDate = new Date(+jsonDate.replace(/\/Date\((\d+)\)\//, '$1')); - falta de párpados

pst era correcto, es posible hacer esto de varias formas sin 'eval'. Crockford dice que 'eval Is Evil' porque es menos legible y menos seguro, además, puede dar a entender que es menos eficiente y más peligroso porque llega al compilador javascript. - Mark Rogers

@Edy: new Function es casi tan malo como eval: dev.opera.com/articles/view/eficiente-javascript/… - Marcel Korpel

@Edy: Esa es otra forma de evaluación, y es igual de 'malvada'. Analice la cadena en su lugar (vea mi respuesta a continuación) - Roy Tinker

Para aquellos que usan Newtonsoft Json.NET, lea cómo hacerlo a través de JSON nativo en IE8, Firefox 3.5 más Json.NET.

Además, la documentación sobre cómo cambiar el formato de fechas escrita por Json.NET es útil: Serializar fechas con Json.NET

Para aquellos que son demasiado vagos, estos son los pasos rápidos. Como JSON tiene una implementación de DateTime suelta, debe usar el IsoDateTimeConverter(). Tenga en cuenta que, desde Json.NET 4.5, el formato de fecha predeterminado es ISO, por lo que el código siguiente no es necesario.

string jsonText = JsonConvert.SerializeObject(p, new IsoDateTimeConverter());

El JSON llegará como

"fieldName": "2009-04-12T20:44:55"

Finalmente, algo de JavaScript para convertir la fecha ISO a una fecha JavaScript:

function isoDateReviver(value) {
  if (typeof value === 'string') {
    var a = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)(?:([\+-])(\d{2})\:(\d{2}))?Z?$/.exec(value);
      if (a) {
        var utcMilliseconds = Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6]);
        return new Date(utcMilliseconds);
      }
  }
  return value;
}

Lo usé así

$("<span />").text(isoDateReviver(item.fieldName).toLocaleString()).appendTo("#" + divName);

Respondido 02 ago 12, 00:08

El constructor de JavaScript Date puede analizar la cadena por usted: new Date("2009-04-12T20:44:55") - david hogue

Advertencia: los formatos y el análisis de Date () Constructor no son estándar antes de ECMAScript 6. Por ejemplo, IE 9 trata la fecha que le da al constructor como una hora local, incluso si está en IS0-8601, que está implícita como UCT en todos los demás lugares. No confíe en el constructor de fecha si es compatible con navegadores más antiguos. codeofmatt.com/2013/06/07/… - dano

El envío de una fecha que no sea UTC tarde o temprano te meterá en problemas. - tímpano

Un poco tarde para la fiesta aquí, pero qué (+ a [1], + a [2] - 1, + a [3], + a [4], + a [5], + a [6]) ; representar en este contexto? - Yanant

@yanant - el +a[1] etc representa las piezas de la matriz de la expresión regular y la + lo lanzaría a un número, así que +a[1] iguales 2009 etc. Aquí está el desglose de la matriz: 0: "2009-04-12T20:44:55" 1: "2009" 2: "04" 3: "12" 4: "20" 5: "44" 6: "55" - jason jong

El ejemplo original:

/Date(1224043200000)/  

no refleja el formato usado por WCF al enviar fechas a través de WCF REST usando la serialización JSON incorporada. (al menos en .NET 3.5, SP1)

Encontré la respuesta aquí útil, pero se requiere una ligera edición de la expresión regular, ya que parece que el desplazamiento GMT de la zona horaria se agrega al número devuelto (desde 1970) en WCF JSON.

En un servicio WCF tengo:

[OperationContract]
[WebInvoke(
    RequestFormat = WebMessageFormat.Json,
    ResponseFormat = WebMessageFormat.Json,
    BodyStyle = WebMessageBodyStyle.WrappedRequest
    )]
ApptVisitLinkInfo GetCurrentLinkInfo( int appointmentsId );

ApptVisitLinkInfo se define simplemente:

public class ApptVisitLinkInfo {
    string Field1 { get; set; }
    DateTime Field2 { get; set; }
    ...
}

Cuando "Field2" se devuelve como Json del servicio, el valor es:

/Date(1224043200000-0600)/

Observe el desplazamiento de la zona horaria incluida como parte del valor.

La expresión regular modificada:

/\/Date\((.*?)\)\//gi

Es un poco más ansioso y agarra todo entre los padres, no solo el primer número. El tiempo resultante desde 1970, más el desplazamiento de la zona horaria, se pueden introducir en la evaluación para obtener un objeto de fecha.

La línea resultante de JavaScript para la sustitución es:

replace(/\/Date\((.*?)\)\//gi, "new Date($1)");

Respondido el 30 de diciembre de 09 a las 01:12

esto es incorrecto, la nueva fecha (1224043200000-0600) solo restará 600 de la fecha, en este caso 600 milisegundos, no 6 horas como debería. - Ariel

Creo que el desplazamiento de la zona horaria solo se incluye si tiene una zona horaria en el objeto DateTime en .NET (que es el comportamiento predeterminado). Si su fecha está en UTC, use DateTime.SpecifyKind (date, DateTimeKind.UTC) y obtendrá el valor UTC correcto cuando se serialice, sin compensación, que luego puede convertir de nuevo a la zona horaria del usuario según sea necesario. Si es en la hora local, use .ToUniversalTime () y se convertirá a UTC, y tendrá el "Tipo" ya especificado para usted. - jvenema

en javascript -0100 será una cadena binaria, ¡así que ten cuidado! - Verbedr

una vez que haya convertido la fecha de WCF a JS, ¿qué tal al revés? ¿Tiene una fecha como entero (usando date.getTime ()) que desea pasar al mismo WCF? - nitinsingh

No se repita: automatice la conversión de fechas usando $.parseJSON()

Las respuestas a su publicación proporcionan conversión manual de fechas a fechas de JavaScript. He extendido jQuery's $.parseJSON() solo un poco, para que pueda analizar automáticamente las fechas cuando se lo indique. Procesa fechas con formato ASP.NET (/Date(12348721342)/) así como fechas con formato ISO (2010-01-01T12.34.56.789Z) que son compatibles con funciones JSON nativas en navegadores (y bibliotecas como json2.js).

De todas formas. Si no desea repetir su código de conversión de fecha una y otra vez, le sugiero que lea esta entrada del blog y obtén el código que te facilitará un poco la vida.

respondido 09 nov., 14:10

Haga clic aquí para ver la demostración

JavaScript / jQuery

var = MyDate_String_Value = "/Date(1224043200000)/"
var value = new Date
            (
                 parseInt(MyDate_String_Value.replace(/(^.*\()|([+-].*$)/g, ''))
            );
var dat = value.getMonth() +
                         1 +
                       "/" +
           value.getDate() +
                       "/" +
       value.getFullYear();

Resultado - "10/15/2008"

respondido 09 nov., 14:11

Solo una mejora para el método anterior. function formatearFecha (fec) {var value = new Date (parseInt (fec.replace (/ (^. * () | ([+ -]. * $) / g, ''))); var mes = value.getMonth (); var dia = value.getDate (); var date = dia + "/" + mes + "/" + value.getFullYear (); if (dia <10) date = date.substr (0, 0) + '0' + dia + date.substr (1); if (mes <10) date = date.substr (0, 3) + '0' + mes + date.substr (4); fecha de retorno;} fecha formateada a ddMMaaaa. ¡Salud! - Matías

Si dices en JavaScript,

var thedate = new Date(1224043200000);
alert(thedate);

verá que es la fecha correcta, y puede usarla en cualquier lugar del código JavaScript con cualquier marco.

contestado el 16 de mayo de 16 a las 14:05

Eso es lo que habría pensado también, excepto que termina siendo: var thedate = / Date (1224043200000) /; al menos para mi... - pelota

Date () y Date (1224043200000) dan el mismo resultado tanto en Chrome como en Firefox. No estoy seguro de si esto funcionó en navegadores antiguos, pero esta respuesta no funciona en navegadores ahora. - James

@James, sí, le está dando al navegador la fecha actual. :( - vissu

Debe escribirlo como "nueva fecha (1224043200000)". - cerebroslugs83

Actualizado

Tenemos una biblioteca de interfaz de usuario interna que tiene que hacer frente al formato JSON integrado ASP.NET de Microsoft, como /Date(msecs)/, preguntado aquí originalmente, y la mayoría de los formatos de fecha de JSON, incluidos JSON.NET, como 2014-06-22T00:00:00.0. Además, tenemos que hacer frente a la incapacidad de oldIE para hacer frente a cualquier cosa que no sean 3 decimales.

Primero detectamos qué tipo de fecha estamos consumiendo, la analizamos en un JavaScript normal Date objeto, luego formatee eso.

1) Detectar formato de fecha de Microsoft

// Handling of Microsoft AJAX Dates, formatted like '/Date(01238329348239)/'
function looksLikeMSDate(s) {
    return /^\/Date\(/.test(s);
}

2) Detectar formato de fecha 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) Parse MS formato de fecha:

function parseMSDate(s) {
    // Jump forward past the /Date(, parseInt handles the rest
    return new Date(parseInt(s.substr(6)));
}

4) Analizar el formato de fecha ISO.

Tenemos al menos una forma de asegurarnos de que estamos tratando con fechas ISO estándar o fechas ISO modificadas para tener siempre tres milisegundos (véase más arriba), por lo que el código es diferente según el entorno.

4a) Analizar el formato de fecha ISO estándar, hacer frente a los problemas de 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) Analizar el formato ISO con posiciones decimales fijas de tres milisegundos, mucho más fácil:

function parseIsoDate(s) {
    return new Date(s);
}

5) Formatee:

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) Átelo todo 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);
}

La respuesta anterior a continuación es útil para vincular este formato de fecha en el propio análisis JSON de jQuery para que obtenga objetos de fecha en lugar de cadenas, o si todavía está atascado en jQuery <1.5 de alguna manera.

Respuesta antigua

Si está utilizando la función Ajax de jQuery 1.4 con ASP.NET MVC, puede convertir todas las propiedades DateTime en objetos Date con:

// Once
jQuery.parseJSON = function(d) {return eval('(' + d + ')');};

$.ajax({
    ...
    dataFilter: function(d) {
        return d.replace(/"\\\/(Date\(-?\d+\))\\\/"/g, 'new $1');
    },
    ...
});

En jQuery 1.5 puede evitar anular el parseJSON método globalmente utilizando la opción converters en la llamada Ajax.

http://api.jquery.com/jQuery.ajax/

Desafortunadamente, debe cambiar a la ruta de evaluación anterior para que las fechas se analicen globalmente en el lugar; de lo contrario, debe convertirlas en un análisis posterior más caso por caso.

contestado el 23 de mayo de 17 a las 13:05

No hay un tipo de fecha incorporado en JSON. Esto parece el número de segundos / milisegundos de alguna época. Si conoce la época, puede crear la fecha agregando la cantidad de tiempo correcta.

Respondido 15 Oct 08, 21:10

Eso es incorrecto, JSON usa fechas de Javascript, con información adicional de zona horaria; la época es la misma que la época de la clase Fecha de javascript (por razones obvias). - cerebroslugs83

@ BrainSlug83: esta respuesta proporciona una referencia para la afirmación de que JSON no tiene un tipo de fecha incorporado. Si no está de acuerdo, proporcione una referencia alternativa. (No está pensando en un marco específico que ha decidido un formato de cadena para representar fechas, ¿verdad? Eso no es parte del estándar JSON, de hecho, no podría serlo porque haría imposible incluir una cadena que no sea se supone que debe tomarse como una fecha, pero tiene un conjunto de caracteres que coinciden con el patrón de fecha). nnnnnn

También tuve que buscar una solución a este problema y, finalmente, encontré moment.js, que es una buena biblioteca que puede analizar este formato de fecha y muchos más.

var d = moment(yourdatestring)

Me ahorró un poco de dolor de cabeza, así que pensé en compartirlo contigo. :)
Puedes encontrar más información al respecto aquí: http://momentjs.com/

contestado el 15 de mayo de 13 a las 07:05

Terminé agregando los "caracteres en la expresión regular de Panos para deshacerme de los generados por el serializador de Microsoft al escribir objetos en un script en línea:

Entonces, si tiene una propiedad en su C # código detrás eso es algo como

protected string JsonObject { get { return jsSerialiser.Serialize(_myObject); }}

Y en tu aspx tienes

<script type="text/javascript">
    var myObject = '<%= JsonObject %>';
</script>

Obtendrías algo como

var myObject = '{"StartDate":"\/Date(1255131630400)\/"}';

Observe las comillas dobles.

Para conseguir esto en una forma que eval deserializará correctamente, utilicé:

myObject = myObject.replace(/"\/Date\((\d+)\)\/"/g, 'new Date($1)');

yo suelo Prototipo y para usarlo agregué

String.prototype.evalJSONWithDates = function() {
    var jsonWithDates = this.replace(/"\/Date\((\d+)\)\/"/g, 'new Date($1)');
    return jsonWithDates.evalJSON(true);
}

respondido 09 nov., 14:10

En jQuery 1.5, siempre que tenga json2.js para cubrir los navegadores más antiguos, puede deserializar todas las fechas que provienen de Ajax de la siguiente manera:

(function () {
    var DATE_START = "/Date(";
    var DATE_START_LENGTH = DATE_START.length;

    function isDateString(x) {
        return typeof x === "string" && x.startsWith(DATE_START);
    }

    function deserializeDateString(dateString) {
        var dateOffsetByLocalTime = new Date(parseInt(dateString.substr(DATE_START_LENGTH)));
        var utcDate = new Date(dateOffsetByLocalTime.getTime() - dateOffsetByLocalTime.getTimezoneOffset() * 60 * 1000);
        return utcDate;
    }

    function convertJSONDates(key, value) {
      if (isDateString(value)) {
        return deserializeDateString(value);
      }
      return value;
    }

    window.jQuery.ajaxSetup({
      converters: {
        "text json": function(data) {
          return window.JSON.parse(data, convertJSONDates);
        }
      }
    });
}());

Incluí lógica que asume que envía todas las fechas desde el servidor como UTC (que debería); el consumidor obtiene un JavaScript Date objeto que tiene el valor de ticks adecuado para reflejar esto. Es decir, llamando getUTCHours(), etc.en la fecha devolverá el mismo valor que en el servidor, y llamando getHours() devolverá el valor en la zona horaria local del usuario según lo determine su navegador.

Esto no tiene en cuenta WCF formato con desplazamientos de zona horaria, aunque sería relativamente fácil de agregar.

respondido 09 nov., 14:10

Solo como una nota: para que el código funcione, debe crear el método startsWith del tipo de cadena: Hugo Zapata

Usar el selector de fechas de jQuery UI - realmente solo tiene sentido si ya está incluyendo jQuery UI:

$.datepicker.formatDate('MM d, yy', new Date(parseInt('/Date(1224043200000)/'.substr(6)))); 

salida:

Octubre 15 de 2008

Respondido 26 Oct 15, 21:10

No pienses demasiado en esto. Como lo hemos hecho durante décadas, pase un desplazamiento numérico de la época estándar de facto del 1 de enero de 1970 a la medianoche GMT / UTC / & c en el número de segundos (o milisegundos) desde esta época. A JavaScript le gusta, a Java le gusta, a C le gusta e Internet le gusta.

respondido 09 nov., 14:10

Y es una lástima que haya más de 20 épocas para elegir. en.wikipedia.org/wiki/Epoch_(fecha_de_referencia) - Más lejos

Todas estas respuestas tienen una cosa en común: todas almacenan fechas como un valor único (generalmente una cadena).

Otra opción es aprovechar la estructura inherente de JSON y representar una fecha como una lista de números:

{ "name":"Nick",
  "birthdate":[1968,6,9] }

Por supuesto, tendría que asegurarse de que ambos extremos de la conversación estén de acuerdo en el formato (año, mes, día) y qué campos deben ser fechas, ... pero tiene la ventaja de evitar por completo la cuestión de la fecha. conversión a cadena. Son todos números, sin ataduras en absoluto. Además, usar el orden: año, mes, día también permite una clasificación adecuada por fecha.

Solo piense fuera de la caja aquí: una fecha JSON no tiene que almacenarse como una cadena.

Otra ventaja de hacerlo de esta manera es que puede seleccionar fácil (y eficientemente) todos los registros para un año o mes determinado aprovechando la forma CouchDB maneja consultas sobre valores de matriz.

respondido 09 nov., 14:10

Aún así, is un formato estándar para fechas en JSON, que es el formato RFC 3339. - gnasher729

@gnasher, eso estaría bien, pero no es el caso. No hay referencias de RFC 7159 a 3339 o viceversa. No hay de jure formato de fecha JSON estándar. Todo lo que queda es de facto estándares, cada uno de los cuales tiene pros y contras. Eso es lo bueno de los estándares. - Marc L.

Publicando en un hilo impresionante:

var d = new Date(parseInt('/Date(1224043200000)/'.slice(6, -2)));
alert('' + (1 + d.getMonth()) + '/' + d.getDate() + '/' + d.getFullYear().toString().slice(-2));

Respondido el 26 de Septiembre de 10 a las 12:09

Buena idea, pero ¿qué pasa si se incluye un desplazamiento de zona horaria? Es mejor usar substr (6) en ese caso en lugar de slice (6, -2); vea mi respuesta a continuación. - Roy Tinker

Solo para agregar otro enfoque aquí, el "enfoque de garrapatas" que WCF toma es propenso a tener problemas con las zonas horarias si no es extremadamente cuidadoso, como se describe aquí y en otros lugares. Así que ahora estoy usando el formato ISO 8601 que tanto .NET como JavaScript son debidamente compatibles e incluye compensaciones de zona horaria. A continuación se muestran los detalles:

En WCF / .NET:

Donde CreationDate es System.DateTime; ToString ("o") está usando .NET's Especificador de formato de ida y vuelta que genera una cadena de fecha compatible con ISO 8601

new MyInfo {
    CreationDate = r.CreationDate.ToString("o"),
};

En JavaScript

Justo después de recuperar el JSON, arreglo las fechas para que sean objetos JavaSript Date utilizando el constructor Date que acepta una cadena de fecha ISO 8601 ...

$.getJSON(
    "MyRestService.svc/myinfo",
    function (data) {
        $.each(data.myinfos, function (r) {
            this.CreatedOn = new Date(this.CreationDate);
        });
        // Now each myinfo object in the myinfos collection has a CreatedOn field that is a real JavaScript date (with timezone intact).
       alert(data.myinfos[0].CreationDate.toLocaleString());
    }
)

Una vez que tenga una fecha de JavaScript, puede usar todos los métodos de fecha convenientes y confiables como hastaCadenaFecha, toLocaleString, etc.

respondido 09 nov., 14:10

var newDate = dateFormat(jsonDate, "mm/dd/yyyy"); 

¿Hay otra opción sin usar la biblioteca jQuery?

respondido 09 nov., 14:10

Esta es una pregunta nueva y debe formularse como su propia pregunta y no incrustada aquí. - spencer sullivan

Esto también puede ayudarlo.

 function ToJavaScriptDate(value) { //To Parse Date from the Returned Parsed Date
        var pattern = /Date\(([^)]+)\)/;
        var results = pattern.exec(value);
        var dt = new Date(parseFloat(results[1]));
        return (dt.getMonth() + 1) + "/" + dt.getDate() + "/" + dt.getFullYear();
    }

Respondido 02 Feb 16, 11:02

Me sale la fecha así:

"/Date(1276290000000+0300)/"

En algunos ejemplos, la fecha tiene formatos ligeramente diferentes:

"/Date(12762900000000300)/"
"Date(1276290000000-0300)"

etc.

Entonces se me ocurrió la siguiente expresión regular:

/\/+Date\(([\d+]+)\)\/+/

y el código final es:

var myDate = new Date(parseInt(jsonWcfDate.replace(/\/+Date\(([\d+-]+)\)\/+/, '$1')));

Espero eso ayude.

Actualización: encontré este enlace de Microsoft: ¿Cómo serializo las fechas con JSON?

Este parece el que todos estamos buscando.

Respondido 03 Oct 10, 08:10

Los reemplazos de expresiones regulares son lentos ... Es mucho más rápido tomar la parte entera usando substr (6) y pasarla a parseInt (); vea mi respuesta a continuación. - Roy Tinker

A continuación se muestra una solución bastante simple para analizar fechas JSON. Utilice las siguientes funciones según sus necesidades. Solo necesita pasar el formato JSON Fecha obtenida como parámetro a las funciones siguientes:

function JSONDate(dateStr) {
    var m, day;
    jsonDate = dateStr;
    var d = new Date(parseInt(jsonDate.substr(6)));
    m = d.getMonth() + 1;
    if (m < 10)
        m = '0' + m
    if (d.getDate() < 10)
        day = '0' + d.getDate()
    else
        day = d.getDate();
    return (m + '/' + day + '/' + d.getFullYear())
}

function JSONDateWithTime(dateStr) {
    jsonDate = dateStr;
    var d = new Date(parseInt(jsonDate.substr(6)));
    var m, day;
    m = d.getMonth() + 1;
    if (m < 10)
        m = '0' + m
    if (d.getDate() < 10)
        day = '0' + d.getDate()
    else
        day = d.getDate();
    var formattedDate = m + "/" + day + "/" + d.getFullYear();
    var hours = (d.getHours() < 10) ? "0" + d.getHours() : d.getHours();
    var minutes = (d.getMinutes() < 10) ? "0" + d.getMinutes() : d.getMinutes();
    var formattedTime = hours + ":" + minutes + ":" + d.getSeconds();
    formattedDate = formattedDate + " " + formattedTime;
    return formattedDate;
}

respondido 09 nov., 14:11

También puede utilizar la biblioteca de JavaScript momento.js, que es útil cuando planea tratar con diferentes formatos localizados y realizar otras operaciones con valores de fechas:

function getMismatch(id) {
    $.getJSON("Main.aspx?Callback=GetMismatch",
    { MismatchId: id },

    function (result) {
        $("#AuthMerchId").text(result.AuthorizationMerchantId);
        $("#SttlMerchId").text(result.SettlementMerchantId);
        $("#CreateDate").text(moment(result.AppendDts).format("L"));
        $("#ExpireDate").text(moment(result.ExpiresDts).format("L"));
        $("#LastUpdate").text(moment(result.LastUpdateDts).format("L"));
        $("#LastUpdatedBy").text(result.LastUpdateNt);
        $("#ProcessIn").text(result.ProcessIn);
    }
    );
    return false;
}

Configurar la localización es tan fácil como agregar archivos de configuración (los obtienes en momentjs.com) a tu proyecto y configurar el idioma:

moment.lang('de');

respondido 09 nov., 14:11

Compruebe la fecha de la norma ISO; algo así:

yyyy.MM.ddThh:mm

Se vuelve 2008.11.20T22:18.

respondido 09 nov., 14:10

Según el esquema JSON, el formato "fecha-hora" corresponde a RFC 3339, sección 5.6. Por lo tanto, debe escribir "aaaa-MM-ddTHH: mm: ssZ" para las fechas en GMT, o la Z reemplazada por una zona horaria como + hh: mm. - gnasher729

El problema es que WCF y otras serializaciones JSON de MS "antiguas" no usan este formato, y eso debe tenerse en cuenta. - Marc L.

Esto es frustrante. Mi solución fue analizar el "/ y /" del valor generado por JavaScriptSerializer de ASP.NET para que, aunque JSON no tenga un literal de fecha, el navegador lo interpretará como una fecha, que es lo que realmente querer:{"myDate":Date(123456789)}

JavaScriptConverter personalizado para DateTime?

Debo enfatizar la precisión del comentario de Roy Tinker. Esto no es JSON legal. Es un truco sucio y sucio en el servidor para eliminar el problema antes de que se convierta en un problema para JavaScript. Ahogará un analizador JSON. Lo usé para despegar, pero ya no lo uso. Sin embargo, sigo sintiendo que la mejor respuesta radica en cambiar la forma en que el servidor formatea la fecha, por ejemplo, ISO como se menciona en otra parte.

contestado el 23 de mayo de 17 a las 11:05

Eso no es JSON legal. Solo funcionará cuando se evalúe con un intérprete de Javascript. Pero si está utilizando un decodificador JSON, se ahogará. - Roy Tinker

Acordado. Y si solo estuviera tratando con este dato, no lo consideraría. Pero si estoy tratando con un objeto de varias fechas y otras propiedades, es más fácil evaluar () todo que seleccionar las propiedades una a la vez. Al final, el problema principal es la falta de una fecha JSON (legal). Hasta que eso exista, nos quedamos con nuestros trucos creativos. - StarTrekCampesino sureño

Una publicación tardía, pero para aquellos que buscaron esta publicación.

Imagine esto:

    [Authorize(Roles = "Administrator")]
    [Authorize(Roles = "Director")]
    [Authorize(Roles = "Human Resources")]
    [HttpGet]
    public ActionResult GetUserData(string UserIdGuidKey)
    {
        if (UserIdGuidKey!= null)
        {
            var guidUserId = new Guid(UserIdGuidKey);
            var memuser = Membership.GetUser(guidUserId);
            var profileuser = Profile.GetUserProfile(memuser.UserName);
            var list = new {
                              UserName = memuser.UserName,
                              Email = memuser.Email ,
                              IsApproved = memuser.IsApproved.ToString() ,
                              IsLockedOut = memuser.IsLockedOut.ToString() ,
                              LastLockoutDate = memuser.LastLockoutDate.ToString() ,
                              CreationDate = memuser.CreationDate.ToString() ,
                              LastLoginDate = memuser.LastLoginDate.ToString() ,
                              LastActivityDate = memuser.LastActivityDate.ToString() ,
                              LastPasswordChangedDate = memuser.LastPasswordChangedDate.ToString() ,
                              IsOnline = memuser.IsOnline.ToString() ,
                              FirstName = profileuser.FirstName ,
                              LastName = profileuser.LastName ,
                              NickName = profileuser.NickName ,
                              BirthDate = profileuser.BirthDate.ToString() ,
            };
            return Json(list, JsonRequestBehavior.AllowGet);
        }
        return Redirect("Index");
    }

Como puede ver, estoy utilizando la función de C # 3.0 para crear genéricos "automáticos". Es un poco vago, pero me gusta y funciona. Solo una nota: Profile es una clase personalizada que he creado para mi proyecto de aplicación web.

Respondido 23 Oct 09, 07:10

así que cada vez que agrega un nuevo rol [Autorizar (Roles = "Recursos humanos")], ¿tiene que compilar e implementar? Guau.... :) - Alex Nolasco

Si se trata de un servicio JSON, la redirección parece incorrecta. Devolvería un 404 Not Found si la clave de entrada es tan inválida que no se puede encontrar (y también 404 si realmente no se encuentra). Cuando mis usuarios no han iniciado sesión, devuelvo 403 Forbidden. - Richard Corfield

Es un método "reutilizable". Por ejemplo, si quisiera obtener datos de usuario de otra Vista, puedo obtenerlos siempre que proporcione el Id. Sin embargo, si no se proporciona el Id, la página redirige a una lista de usuarios (índice) para seleccionar un usuario. Se necesita una solución simple para la aplicación, tal como mi cerebro la preparó en ese momento. - ray linder

Para su información, para cualquiera que use Python en el lado del servidor: datetime.datetime (). Ctime () devuelve una cadena que se puede analizar de forma nativa por "new Date ()". Es decir, si crea una nueva instancia de datetime.datetime (como con datetime.datetime.now), la cadena se puede incluir en la cadena JSON, y luego esa cadena se puede pasar como primer argumento al constructor Date. Todavía no he encontrado ninguna excepción, pero tampoco lo he probado con demasiada rigurosidad.

Respondido 08 Jul 10, 02:07

Solución Mootools:

new Date(Date(result.AppendDts)).format('%x')

Requiere mootools-more. Probado con mootools-1.2.3.1-more en Firefox 3.6.3 e IE 7.0.5730.13

Respondido el 21 de Septiembre de 10 a las 13:09

var obj = eval('(' + "{Date: \/Date(1278903921551)\/}".replace(/\/Date\((\d+)\)\//gi, "new Date($1)") + ')');
var dateValue = obj["Date"];

Respondido 01 Jul 11, 10:07

Agregue la jQuery UI complemento en su página:

function DateFormate(dateConvert) {
    return $.datepicker.formatDate("dd/MM/yyyy", eval('new ' + dateConvert.slice(1, -1)));
};

respondido 09 nov., 14:10

Y si .NET devoluciones...

return DateTime.Now.ToString("u"); //"2013-09-17 15:18:53Z"

Y luego en JavaScript ...

var x = new Date("2013-09-17 15:18:53Z");

respondido 09 nov., 14:11

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.