Tengo una función de JavaScript que toma un número (1-31), crea una Date y la envía a un servidor a través de una solicitud AJAX :
sendDate(d) { let date = new Date(this.year, this.month, d); htmx.ajax("GET", "/some/url", { values: { "date": date.toISOString() } }); } El problema es que JavaScript está haciendo una corrección de zona horaria que tiene el efecto de que si creo una fecha como new Date(2022, 09, 14) obtengo una fecha Wed Sep 14 2022 00:00:00 GMT+0200 (Central European Summer Time) que, cuando se convierte al formato ISO, se convierte en 2022-09-13T22:00:00.000Z , es decir. el día anterior.
Sé que puedo usar .toLocaleDateString() , pero me gustaría ceñirme al formato ISO y también me gustaría evitar soluciones engañosas como crear siempre la fecha con una hora específica a la mitad del día o lo que sea.
¿Existe una manera simple de crear un objeto de fecha regular y pasarlo a un servidor sin travesuras de zona horaria?
Los valores pasados al constructor Date se tratan como locales, toISOString usa UTC. Desafortunadamente, ECMAScript no tiene una forma de solo fecha y libre de zona horaria.
Si desea usar toISOString para formatear la marca de tiempo, entonces una solución es analizar los valores como UTC inicialmente, por ejemplo
sendDate(d) { let date = new Date(Date.UTC(this.year, this.month, d)); htmx.ajax("GET", "/some/url", { values: { "date": date.toISOString() } }); }Ejemplo:
let d = new Date() let year = d.getFullYear(); let month = d.getMonth() let day = d.getDate(); let date = new Date(Date.UTC(year, month, day)) // Always shows the current local date as 00:00:00Z console.log( date.toISOString() );También debe recortar la Z desde el final, ya que la marca de tiempo es realmente local.
Hay una forma de hacerlo: almacenar la fecha como la marca de tiempo de UNIX. Lo hago de esta manera y, cuando es necesario, paso la marca de tiempo del servidor al cliente y la convierto en fecha local.
Dicho esto, no creo que sea una buena idea construir la fecha en el cliente y pasarla al servidor, ya que podría modificarse en el cliente. Creo que se hace principalmente de esta manera (y así es como se hace en mis proyectos): en el lado del servidor, verifica la marca de tiempo actual (en el momento en que se envía la solicitud) y hace lo que quiera.
Parece que le permite a su usuario elegir una fecha. Sería un buen enfoque convertirlo en una marca de tiempo y pasarlo al servidor.
¿Cómo lo harías tú? Si devuelvo
date.getTime()y luego lo analizo (en python) condatetime.fromtimestamp(int(request.GET['date']) / 1000)Sigo teniendo el mismo problema de zona horaria...
No tendrá ningún problema en este caso, aparte del hecho de que su servidor podría tener una hora local diferente. Una solución independiente de la zona horaria tendría que usar utcfromtimestamp en lugar de fromtimestamp .
De cualquier manera, la marca de tiempo en sí misma no puede tener ningún problema de zona horaria por definición .
Vea la respuesta de RobG... usando el new Date(Date.UTC(year, month, day)) es mucho mejor.