Tengo problemas con la precisión de tiempo en mi backend. Aquí hay un ejemplo de código:
const inputDateString = `2022-05-30 13:45:15` // assume it as UTC without specifying the timezone // we use loadbalancing and auto-scale so our backend engine might be everywhere, // so we dont take local time into account, we always treat date as UTC let systemGetDate = new Date(inputDateString) console.log(systemGetDate.valueOf()) // => 1653893115000, it should be 1653918315000 // 1653893115000 is GMT: Monday, 30 May 2022 06:45:15, but 2022-05-30 13:45:15 in my local time! const inputDateStringWithTimezone = `2022-05-30 13:45:15+00` systemGetDate = new Date(inputDateStringWithTimezone) console.log(systemGetDate.valueOf()) // => 1653918315000, its right now. but only when timezone explicitly specified ¿Podemos hacer que la nueva Fecha (cadena) siempre trate la entrada como UTC, sin convertirla como hora local? Estoy bien, el objeto Date está en hora local, pero al menos getTime o valueOf en UTC de alguna manera.
Actualmente, mi solución alternativa es usar la biblioteca moment.js , puede dar como resultado el resultado que quiero.
pero sé que será malo depender demasiado de otra biblioteca, puede romperse o quedar obsoleta más adelante. ( https://momentjs.com/docs/#/-project-status , el propio funcionario explica que se suspenderá)
alguna solución mejor para solucionar este problema? o debería eliminar todo esto y especificar explícitamente la zona horaria en todo el sistema?
const inputDateString = `2022-05-30 13:45:15` // assume it as UTC without specifying the timezone
Las marcas de tiempo sin zona horaria o compensación se tratan como locales, no como UTC. El formato de esa marca de tiempo en particular no es compatible con ECMA-262, por lo que el análisis depende de la implementación (consulte ¿Por qué Date.parse da resultados incorrectos? ) y puede dar como resultado una fecha no válida o un valor inesperado.
¿Podemos hacer que la nueva Fecha (cadena) siempre trate la entrada como UTC, sin convertirla como hora local?
Sí, reformateándolo a un formato compatible que el analizador integrado debe tratar como UTC, por ejemplo:
'2022-05-30T13:45:15Z'Alternativamente, puede analizarlo usted mismo y pasar los valores a Date.UTC para que se traten como UTC, por ejemplo
let date = `2022-05-30 13:45:15`; // Reformat and use the built–in parser let reformattedDate = date.replace(' ','T') + 'Z'; console.log(new Date(reformattedDate).toISOString()); // Using Date.UTC let [Y, M, D, H, m, s] = date.split(/\D/); let d = new Date(Date.UTC(Y, M-1, D, H, m, s)); console.log(d.toISOString());