breezejs: la fecha no está configurada en el momento correcto

Me di cuenta de que si una propiedad de fecha vuelve del servidor con el valor “2013-07-11T17: 11: 04.700”, entonces brisa cambia el valor a Thu Jul 11 ​​19:11:04 UTC + 0200 2013.

Observe que el tiempo ahora es de 2 horas por delante!

Ya había encontrado este problema al guardar entidades, así que tuve que convertir explícitamente mis propiedades de fecha usando momentjs:

date.hours(date.hours() - moment().zone() / 60); 

Pero ahora parece que el problema también ocurre cuando se realizan operaciones de lectura.

¿Cuál es la mejor manera de asegurarse de que breeze no altere los valores de mis propiedades de fecha?

Breeze no manipula las fechas y horas que van desde y hacia el servidor de ninguna manera, EXCEPTO para agregar un especificador de zona horaria UTZ a cualquier fecha devuelta desde el servidor que aún no la tenga. Esto solo se hace porque diferentes navegadores interpretan las fechas sin un especificador de zona horaria de manera diferente y queremos coherencia entre los navegadores.

Es probable que la fuente de sus problemas sea que cuando guarde sus datos con fechas en la base de datos, el tipo de datos dateTime que está utilizando NO contenga un desplazamiento de zona horaria. Esto significa que cuando se recuperan los datos, es probable que “pierda” el desplazamiento y aparezca el valor predeterminado de Breeze mencionado anteriormente. Esto puede corregirse utilizando un tipo de datos de fecha y hora con un desfase horario (datetime2 o datetimeoffset en SQLServer).

Tenga en cuenta que su navegador NO formatea las fechas de acuerdo con su zona horaria actual.

Otro enfoque es que puede reemplazar el DataType.parseDateFromServer de Breeze para NO inferir ninguna información de zona horaria si no se proporciona:

 breeze.DataType.parseDateFromServer = function (source) { return new Date(Date.parse(source)); }; 

Sin embargo, esto puede encontrarse con el problema de que los diferentes navegadores interpretan las cadenas DateTime sin un desplazamiento de zona horaria de manera diferente … Por lo tanto, puede obtener resultados extraños dependiendo del navegador. Si eso sucede, deberá agregar algún código de detección del navegador al fragmento de arriba.

Otra alternativa es hacer lo siguiente usando la biblioteca moment.js.

 breeze.DataType.parseDateFromServer = function (source) { var date = moment(source); return date.toDate(); }; 

No estoy seguro de lo útil que es esto, pero espero que el comportamiento de Breeze sea más claro.

De forma predeterminada, Breeze no proporciona ninguna forma de hacerlo, pero puede mantener el siguiente código en su archivo JS modelo para solucionar este problema:

 breeze.DataType.parseDateFromServer = function (source) { if (typeof source === 'string') { //Check for local offset time or UTC time from server if (source.slice(-1) !== "Z") { var oldSource = source; try { source = source.substring(0, source.lastIndexOf("-") - 1) source = new Date(source); var tzDifference = source.getTimezoneOffset(); //convert the offset to milliseconds, add to targetTime, and make a new Date var offsetTime = new Date(source.getTime() + tzDifference * 60 * 1000); return offsetTime; } catch (err) { source = new Date(source); return source; } } else { source = new Date(source); var tzDifference = source.getTimezoneOffset(); //convert the offset to milliseconds, add to targetTime, and make a new Date var offsetTime = new Date(source.getTime() + tzDifference * 60 * 1000); return offsetTime; } } } 
Intereting Posts