1322 votos

Cómo dar formato a un Microsoft JSON fecha?

Me estoy tomando mi primera grieta en Ajax con jQuery. Me estoy poniendo mis datos en mi página, pero estoy teniendo algunos problemas con el JSON de datos que se devuelve para los tipos de datos de Fecha. Básicamente, estoy recibiendo una cadena que se parece a esto:

/Date(1224043200000)/

De alguien totalmente nuevo para JSON - ¿Cómo puedo darle formato a este a un formato de fecha corta? Debe ser manejado en algún lugar en el código jQuery? He intentado jQuery.UI.datepicker plugin usando $.datepicker.formatDate() sin ningún éxito.

FYI: Aquí está la solución que se me ocurrió con el uso de 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 conseguí mi objeto desde el método de devolución de llamada y muestra las fechas en la página correctamente con el formato de fecha de la biblioteca.

1241voto

Roy Tinker Puntos 8054

Eval no es necesario. Esto funciona bien:

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

La función substr se lleva a cabo el "/Date(" parte, y la función parseInt obtiene el entero y omite el ")/" al final. El número resultante se pasa al constructor de Fecha.

EDIT: he intencionalmente dejado de la base (el 2º argumento para parseInt); véase mi comentario a continuación. También, estoy completamente de acuerdo con Rory comentario: ISO-8601 fechas son preferibles a este formato antiguo -- por lo que este formato generalmente no debe ser utilizado para un nuevo desarrollo. Ver el excelente Json.NET biblioteca para una gran alternativa que serializa fechas usando la norma ISO-8601 formato.

Para ISO-8601 formato JSON fechas, acaba de pasar el string en el constructor de Fecha:

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

78voto

Panos Puntos 11429

Usted puede utilizar esto para obtener una fecha de json:

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

y, a continuación, puede utilizar JavaScript Formato de Fecha script (1.2 KB cuando record y gzip) para mostrar como desee.

53voto

Jason Jong Puntos 2811

Para aquellos que utilizan Newtonsoft Json.NET, lee sobre cómo hacerlo a través de JSON Nativo en IE8, Firefox 3.5 plus Json.NET.

También la documentación sobre cómo cambiar el formato de las fechas escrito por Json.NET es útil: Registrar las Fechas con Json.NET

Para aquellos que son demasiado perezosos, aquí están los pasos rápidos. Como JSON tiene un suelto DateTime aplicación, usted necesita 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 de abajo no es necesario.

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

El JSON que vendrá a través de

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

Por último, algunos JavaScript para convertir el ISO fecha de JavaScript fecha:

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

Yo lo he utilizado como este

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

36voto

Aaron Puntos 720

El ejemplo original:

/Date(1224043200000)/  

no refleja el formato utilizado por la WCF cuando el envío de fechas a través de WCF REST utilizando el incorporado en la serialización JSON. (al menos en .NET 3.5 SP1)

He encontrado la respuesta aquí, pero un ligero modificar la expresión regular es necesaria, ya que parece que de la zona horaria GMT offset se anexa en el número devuelto (desde 1970) en WCF JSON.

En un servicio de 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 "Campo2" se devuelve en Json desde el servicio, el valor es:

/Date(1224043200000-0600)/

Aviso el ajuste de zona horaria se incluye como parte del valor.

La modificación de la expresión regular:

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

Es un poco más ganas y agarra todo lo que está entre paréntesis, no sólo el primer número. El tiempo resultante sinze 1970, más el ajuste de zona horaria se puede todos ser alimentado en el eval para obtener un objeto date.

La línea resultante de JavaScript para el reemplazo:

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

34voto

Robert Koritnik Puntos 45499

Don't repeat yourself - automatizar la fecha de la conversión de uso de $.parseJSON()

Las respuestas a tu post proporcionar el manual de la fecha de conversión de Javascript fechas. Me he extendido jQuery $.parseJSON() sólo un poco, de manera que es capaz de analizar automáticamente las fechas de cuando se la instruye. Los procesos de ti Asp.net formato de fechas (/Date(12348721342)/), así como la ISO formato de fechas (2010-01-01T12.34.56.789Z) que son compatibles con JSON nativo funciones en los navegadores (y las bibliotecas como json2.js).

De todos modos. Si usted no desea repetir su fecha de conversión de código una y otra vez le sugiero que lea este blog y obtener el código que va a hacer su vida un poco más fácil.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by: