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.