Given a date, how can I get the previous Monday in UTC format regardless of time zone?

I am given a unix timestamp like this: 1655402413 and am needing to find find the midnight of the Monday (in UTC/GMT format) of the same week, regardless of what day it is or what time zone. I then need to represent that Monday as a unix timestamp and return it. The function I have is as follows:

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;
}

That function almost works, but there are two problems, both related to the fact that the Date seems to always work with the user’s current timezone:

  1. If given a timestamp that evaluates to midnight on a Monday in UTC/GMT format, depending on the time zone of the user, it returns the Monday of the previous week (because startDate evaluates to the Sunday before the Monday), which is not good.
  2. The monday that is returned is in local time, not UTC/GMT time.

This is driving me absolutely insane. Working with dates in JavaScript is a nightmare, and I would appreciate any direction you can give me.

>Solution :

Multiply the unix timestamp by 1000, and use the UTC methods like getUTCDate instead of getDate, setUTCHours instead of setHours etc..

Of course to return as unix time, just divide by 1000.

eg.

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);

Leave a Reply