Saltar al contenido

Cómo JSON stringify una fecha javascript y preservar la zona horaria

Posterior a de nuestra extensa compilación de información hemos podido solucionar esta preocupación que presentan ciertos de nuestros usuarios. Te dejamos la solución y nuestro objetivo es serte de gran apoyo.

Solución:

Suponiendo que tiene algún tipo de objeto que contiene un Date:

var o =  d : new Date() ;

Puede anular el toJSON función de la Date prototipo. Aquí uso moment.js para crear un moment objeto de la fecha, luego use el momento format función sin parámetros, que emite el formato extendido ISO8601 incluyendo el offset.

Date.prototype.toJSON = function() return moment(this).format(); 

Ahora, cuando serialice el objeto, utilizará el formato de fecha que solicitó:

var json = JSON.stringify(o);  //  '"d":"2015-06-28T13:51:13-07:00"'

Por supuesto, eso afectará todosDate objetos. Si desea cambiar el comportamiento de solo el objeto de fecha específico, puede anular solo el de ese objeto en particular. toJSON función, así:

o.d.toJSON = function() return moment(this).format(); 

Basado en la respuesta de Matt Johnsons, volví a implementar toJSON sin tener que depender de moment (que creo que es una biblioteca espléndida, pero una dependencia en un método de tan bajo nivel como toJSON me molesta).

Date.prototype.toJSON = function () 
  var timezoneOffsetInHours = -(this.getTimezoneOffset() / 60); //UTC minus local time
  var sign = timezoneOffsetInHours >= 0 ? '+' : '-';
  var leadingZero = (Math.abs(timezoneOffsetInHours) < 10) ? '0' : '';

  //It's a bit unfortunate that we need to construct a new Date instance 
  //(we don't want _this_ Date instance to be modified)
  var correctedDate = new Date(this.getFullYear(), this.getMonth(), 
      this.getDate(), this.getHours(), this.getMinutes(), this.getSeconds(), 
      this.getMilliseconds());
  correctedDate.setHours(this.getHours() + timezoneOffsetInHours);
  var iso = correctedDate.toISOString().replace('Z', '');

  return iso + sign + leadingZero + Math.abs(timezoneOffsetInHours).toString() + ':00';

Él setHours El método ajustará otras partes del objeto de fecha cuando el valor proporcionado se "desborde". Desde MDN:

Si un parámetro que especifica está fuera del rango esperado, setHours() intenta actualizar la información de fecha en el objeto Fecha en consecuencia. Por ejemplo, si usa 100 para segundosValor, los minutos se incrementarán en 1 (minutosValor + 1), y 40 se usará para segundos.

Siempre me inclinaría a no meterme con las funciones en el prototipo de los objetos del sistema como la fecha, nunca se sabe cuándo eso te afectará de alguna manera inesperada más adelante en tu código.

En cambio, el método JSON.stringify acepta una función de "reemplazo" (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#The_replacer_parameter) que puede proporcionar, lo que permite usted para anular las entrañas de cómo JSON.stringify realiza su "stringificación"; para que puedas hacer algo como esto;

var replacer = function(key, value) 

   if (this[key] instanceof Date) 
      return this[key].toUTCString();
   
   
   return value;


console.log(JSON.stringify(new Date(), replacer));
console.log(JSON.stringify( myProperty: new Date(), replacer));
console.log(JSON.stringify( myProperty: new Date(), notADate: "I'm really not", trueOrFalse: true, replacer));

Recuerda que te concedemos reseñar tu experiencia si te fue de ayuda.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *