Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

339
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda