Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

334
Vistas
Dada una fecha, ¿cómo puedo obtener el lunes anterior en formato UTC independientemente de la zona horaria?

Me dan una marca de tiempo de Unix como esta: 1655402413 y necesito encontrar la medianoche del lunes (en formato UTC/GMT) de la misma semana, independientemente de qué día sea o qué zona horaria. Luego necesito representar ese lunes como una marca de tiempo de Unix y devolverlo. La función que tengo es la siguiente:

 function findMonday(unixTimeStamp) { let startDate = new Date(unixTimeStamp); let startDay = startDate.getDay(); let diff = startDate.getDate() - startDay + (startDay === 0 ? -6 : 1); let monday = new Date(startDate.setDate(diff)); monday.setHours(0, 0, 0, 0); monday = new Date(monday).valueOf(); return monday; }

Esa función casi funciona, pero hay dos problemas, ambos relacionados con el hecho de que la Fecha parece funcionar siempre con la zona horaria actual del usuario:

  1. Si se le da una marca de tiempo que se evalúa como la medianoche de un lunes en formato UTC/GMT, según la zona horaria del usuario, devuelve el lunes de la semana anterior (porque startDate evalúa como el domingo anterior al lunes), lo cual no es bueno .
  2. El monday que se devuelve está en la hora local, no en la hora UTC/GMT.

Esto me está volviendo absolutamente loco. Trabajar con fechas en JavaScript es una pesadilla, y agradecería cualquier dirección que me puedan dar.

about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

Multiplique la marca de tiempo de Unix por 1000 y use los métodos UTC como getUTCDate en lugar de getDate , setUTCHours en lugar de setHours , etc.

Por supuesto, para regresar como tiempo Unix, solo divida por 1000.

p.ej.

 function findMonday(unixTimeStamp) { let startDate = new Date(unixTimeStamp * 1000); let startDay = startDate.getUTCDay(); let diff = startDate.getUTCDate() - startDay + (startDay === 0 ? -6 : 1); let monday = new Date(startDate.setUTCDate(diff)); monday.setUTCHours(0, 0, 0, 0); monday = new Date(monday).valueOf(); return monday; } const monday = findMonday(1655402413); const unixMonday = Math.trunc(monday / 1000); console.log('The Date: ' + new Date(monday).toISOString()); console.log('Unix time: ' + unixMonday);

about 4 years ago · Juan Pablo Isaza Denunciar

0

En cuanto a la respuesta de Keith, pero un poco más concisa. Devuelve segundos, no milisegundos. ;-)

 // Given UNIX timestamp, return similar timestamp for // previous UTC Monday at 00:00:00 let getLastUTCMonday = ts => { let d = new Date(ts * 1e3); d.setUTCDate(d.getUTCDate() - (d.getUTCDay() || 7) + 1); return d.setUTCHours(0,0,0,0) / 1e3 | 0; }; let ts = 1655402413; let tsPriorMonday = getLastUTCMonday(ts) console.log( `Start date : ${new Date(ts*1e3).toUTCString()}\n` + `Prior Monday: ${new Date(tsPriorMonday * 1e3).toUTCString()}` );

En ECMA-262, las compensaciones de la época (en milisegundos) se denominan "valores de tiempo". Una marca de tiempo es cualquier cosa que represente una hora o una fecha, por lo que un valor de tiempo es una marca de tiempo. ;-)

Dado que los días UTC de ECMAScript siempre duran exactamente 8,64e7 milisegundos, puede calcular el lunes UTC anterior a partir de hoy mediante una aritmética simple.

La época de ECMAScript fue el jueves 1 de enero de 1970 a las 00:00:00, por lo que puede:

  1. Reste 4 días UTC en milisegundos (34.56e7) de la fecha para alinearlos con el lunes en lugar del jueves
  2. Obtenga el resto de dividir ese valor por la cantidad de milisegundos en 7 días UTC (7 * 8.64e7 o 60.48e7)
  3. Reste el resto de la fecha actual, que volverá el lunes anterior y también eliminará el componente de tiempo

El algoritmo anterior solo funciona para fechas posteriores a la época. Las fechas anteriores tienen valores de tiempo negativos, así que agregue 3 días antes de obtener el resto, luego reste el resto + 7 días (es decir, fecha - resto - 7 días).

Lo siguiente solo hace el cálculo posterior a la época:

 let getPreviousUTCMonday = date => { let weekRem = (date - 34.56e7) % 60.48e7; return date - weekRem; } let d = new Date(); for (let i=0; i<12; i++) { console.log(`${d.toUTCString()}\n` + `${new Date(getPreviousUTCMonday(d)).toUTCString()}`); d.setDate(d.getDate() + 1); }

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda