Estoy tratando de encontrar si la hora y la fecha actuales son iguales a una fecha que proviene de una API.
Los datos de la API tienen el siguiente formato: 2021-01-02T08:00:00+01:00
El código que tengo actualmente es:
if (new Date() === new Date(apiData) { alert('its the current time accurate to seconds') }El problema es que no creo que esto tenga en cuenta las diferentes zonas horarias, solo quiero ejecutar el código si la hora es exactamente la de la API, sin importar de dónde venga el cliente.
La marca de tiempo 2021-01-02T08:00:00+01:00 representa un momento único en el tiempo. Si se analiza de acuerdo con ECMA-262, producirá un valor de tiempo que es un desplazamiento de milisegundos desde la época de ECMAScript: 1970-01-01T00:00:00Z.
El valor de tiempo generado es independiente de la configuración del sistema host, es decir, el desplazamiento del host no tiene efecto. Asi que:
Date.parse('2021-01-02T08:00:00+01:00');producirá exactamente el mismo valor (1609570800000) en cada implementación consistente con ECMA-262.
Si se pasa al constructor de Fecha, la marca de tiempo se analizará exactamente de la misma manera, con el valor de tiempo que se usa para una instancia de Fecha tal que:
let ts = '2021-01-02T08:00:00+01:00'; Date.parse(ts) == new Date(ts).getTime();Como se menciona en los comentarios, los valores de tiempo de ECMAScript tienen una precisión de milisegundos, por lo que la posibilidad de que lo anterior sea verdadero es extremadamente pequeña. Reducir la precisión a un segundo (por ejemplo, redondeando o truncando los segundos decimales) no ayudará mucho.
Si desea ejecutar algún código en el momento indicado por la marca de tiempo, lo mejor es calcular el tiempo restante y, si es en el futuro, establezca un tiempo de espera, algo como:
let timeLeft = Date.parse(timestamp) - Date.now(); if (timeLeft >= 0) { setTimeout(doStuff, timeLeft); }P.ej
/* Create timestamp in future with specified offset * @param {string} timeAhead - time in future in H[:m[:s[.sss]]] format * @param {string} offset - offset as [-]H[:mm] * @returns {string} ISO 8601 formatted timestamp with offset */ function getFutureTimestamp(timeAhead, offset) { let pad = n => ('0' + n).slice(-2); let [h, m, s, ms] = timeAhead.split(/\D/); let timems = (h||0)*3.6e6 + (m||0)*6e4 + (s||0)*1e3 + (ms||0)*1; let oSign = /^-/.test(offset)? -1 : +1; let [oH, om] = offset.match(/\d+/g) || []; let oms = oSign * (oH*3.6e6 + (om||0)*6e4); let d = new Date(Date.now() + oms + timems); return d.toISOString().replace('Z', `${oSign < 0? '-':'+'}${pad(oH)}:${pad(om||0)}`); } // timestamp for 5 seconds from now with offset +1 let ts = getFutureTimestamp('0:0:5','1'); // Calculate ms from now to ts let delay = Date.parse(ts) - Date.now(); console.log('Run at ' + ts); // Show timestamp after lag if (delay >= 0) { setTimeout(()=>console.log('done: ' + new Date().toISOString()), delay); }Tenga en cuenta que en lo anterior, la primera marca de tiempo mostrada será +1, la segunda +0, por lo que tendrán 1 hora de diferencia.
Los tiempos de espera no se ejecutan necesariamente después del tiempo especificado. Sin embargo, lo anterior parece ser unos pocos milisegundos. Hasta donde yo sé, la precisión del tiempo de espera (basado en el reloj del sistema) no depende de la duración de la demora, sino de cuán ocupado está el sistema cuando transcurre.
if (new Date().getTime() === new Date(apiData).getTime()) { alert('its the current time accurate to seconds') }