Parece que se encuentra en la zona horaria Europe/Berlin o similar y actualmente tiene un desplazamiento positivo de 2 horas con respecto a UTC.
La marca de tiempo en formato ISO debe especificar la zona horaria como sufijo. Z sería UTC. Sin embargo, a su marca de tiempo de measurementTimestamp le falta el sufijo, y la new Date lo interpreta como "la zona horaria local actual" (en su caso, +02:00), por lo que obtiene una discrepancia aquí.
Puede agregar la Z faltante a la marca de tiempo de measurementTimestamp para resolver este problema:
(new Date('2021-09-24T15:38:18.569Z') - new Date('2021-09-24T15:37:46.612Z')) / 1000 // ^ // Result: 31.957 Importante: esto no es lo mismo que eliminar la Z de la otra marca de tiempo porque entonces compararía dos horas en zonas horarias locales (y, de hecho, horas que son irrelevantes para cualquier cosa que realmente le interese, porque son el resultado de interpretar las horas UTC como horas locales que luego apuntan a un momento diferente en el tiempo).
Puede pensar que esto no importa porque si ambos son locales ahora, la compensación debería cancelarse, ¿verdad? ... ¡pero este no es el caso si hay un límite de horario de verano entre las marcas de tiempo que compara! Si ambos son UTC, son absolutos (no hay horario de verano en UTC como tal; sería en Europe/London , pero no es lo mismo), pero en su zona horaria local puede hacer que los relojes se muevan hacia adelante y hacia atrás. hora dos veces al año ( Europe/Berlin es +02:00 durante medio año y +01:00 el resto del tiempo).
Vea estos resultados que obtengo (estoy en Europe/Berlin ):
(new Date('2021-03-28T03:00:00Z') - new Date('2021-03-28T01:00:00Z')) / 1000 // Result: 7200 (new Date('2021-03-28T03:00:00') - new Date('2021-03-28T01:00:00')) / 1000 // Result: 3600 (!!!)El reloj se adelantó el 28 de marzo de 2021 de 02:00 a 03:00 aquí. Entonces, comparar estas dos horas de 03:00 y 01:00 con la zona horaria local me da solo una hora de diferencia en lugar de dos. Si ahora tenía la intención de comparar las 03:00 UTC con las 01:00 UTC , obtuve un resultado totalmente incorrecto y puede arruinar mi día.
Permítanme agregar un ejemplo más, incluso peor, a esto:
(new Date('2021-03-28T03:30:00Z') - new Date('2021-03-28T02:45:00Z')) / 1000 // Result: 2700 (new Date('2021-03-28T03:30:00') - new Date('2021-03-28T02:45:00')) / 1000 // Result: -900 (???)03:30 deberían ser 45 minutos (2700 segundos) después de las 02:45, ¿verdad? Entonces, ¿cómo es que ahora tenemos un número negativo de -15 minutos? Bueno, en mi hora local, las 02:45 ni siquiera existen porque después de las 01:59 llegaron las 03:00 de ese día... y se trata igual que si intentaras establecer una fecha como el 31 de noviembre en JavaScript. (que se manejaría como el 1 de diciembre): se da la vuelta y se trata igual que las 03:45.
Bien, probablemente lo entendí: necesito eliminar el carácter Z del formato toISOString. Funciona, pero no estoy seguro, si es el enfoque correcto.
(nueva Fecha(nueva Fecha().toISOString().slice(0,-1)) - nueva Fecha(medida.medidaTimestamp))/1000