Sé que esto es un poco tarde, pero esta es la solución que tuve que encontrar para manejar las fechas en las que desea ser independiente de la zona horaria. Básicamente, implica convertir todo a UTC.
De Javascript al servidor :
Envíe las fechas como valores de época sin el desplazamiento de la zona horaria.
var d = new Date(2015,0,1) // Jan 1, 2015
// Ajax Request to server ...
$.ajax({
url: '/target',
params: { date: d.getTime() - (d.getTimezoneOffset() * 60 * 1000) }
});
A continuación, el servidor recibe 1420070400000 como fecha de época.
En el lado del servidor, convierta ese valor de época en un objeto de fecha y hora:
DateTime d = new DateTime(1970, 1, 1, 0, 0, 0).AddMilliseconds(epoch);
En este punto, la fecha es solo la fecha / hora proporcionada por el usuario tal como la proporcionó. Efectivamente es UTC.
Yendo al revés :
Cuando el servidor extrae datos de la base de datos, presumiblemente en UTC, obtenga la diferencia como una época (asegurándose de que ambos objetos de fecha sean locales o UTC):
long ms = (long)utcDate.Subtract(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds;
o
long ms = (long)localDate.Subtract(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Local)).TotalMilliseconds;
Cuando javascript reciba este valor, cree un nuevo objeto de fecha. Sin embargo, este objeto de fecha se asumirá como la hora local, por lo que debe compensarlo con la zona horaria actual:
var epochValue = 1420070400000 // value pulled from server.
var utcDateVal = new Date(epochValue);
var actualDate = new Date(utcDateVal.getTime() + (utcDateVal.getTimezoneOffset() * 60 * 1000))
console.log(utcDateVal); // Wed Dec 31 2014 19:00:00 GMT-0500 (Eastern Standard Time)
console.log(actualDate); // Thu Jan 01 2015 00:00:00 GMT-0500 (Eastern Standard Time)
Hasta donde yo sé, esto debería funcionar para cualquier zona horaria en la que necesite mostrar fechas que son independientes de la zona horaria.