Home > Enterprise >  Given an ISO date, get the days of the week in form of ISO string ranges
Given an ISO date, get the days of the week in form of ISO string ranges

Time:09-22

Suppose I have an ISO date, such as 2021-09-18T20:18:27.000Z

  1. I would like to get the dates of the past week in form of an array
  2. The array should be a set of arrays that have two ISO dates that represent the start of the day and the end of the day as illustrated below:

E.g.

input:

2021-09-18T20:18:27.000Z

output:

[
['"2021-09-11T00:00:00.000Z', '"2021-09-11T23:59:59.000Z'],
['"2021-09-12T00:00:00.000Z', '"2021-09-11T23:59:59.000Z'],
['"2021-09-13T00:00:00.000Z', '"2021-09-11T23:59:59.000Z'],
['"2021-09-14T00:00:00.000Z', '"2021-09-11T23:59:59.000Z'],
['"2021-09-15T00:00:00.000Z', '"2021-09-11T23:59:59.000Z'],
['"2021-09-16T00:00:00.000Z', '"2021-09-11T23:59:59.000Z'],
['"2021-09-17T00:00:00.000Z', '"2021-09-11T23:59:59.000Z'],
['"2021-09-18T00:00:00.000Z', '"2021-09-18T23:59:59.000Z'],
]

I've already tried it with dayjs, this results in the array representing exact intervals from a particular date:

function getDates(date) {
  var dates = [date]
  var noOfDays = 7

  for (let i = noOfDays - 1; i >= 0; i--) {
    const elementIndex = i - noOfDays // Get last nth element of the list
    const dateToIncrement = dates.slice(elementIndex)[0]
    const newDate = dayjs(dateToIncrement).subtract(1, "day").toISOString()
    dates.unshift(newDate)
  }
  return dates
}

Thank you

CodePudding user response:

function getPastWeek(inputTime) {
    var res = []; //result array
    var currentDayEnd = undefined; //variable to be set on each iteration
    var currentDay = new Date(inputTime.split('T')[0]); //create new Date object
    currentDay.setDate(currentDay.getDate() - 7); //reduce seven days from current date

    for(var i = 0; i <= 7; i  ) { //foreach day in last week
        currentDayEnd = new Date(currentDay.getTime() - 1000); //previous day end (1sec before current day start)
        currentDayEnd.setDate(currentDayEnd.getDate()   1); //current day end (one day after previous day end)
        res.push([currentDay.toISOString(), currentDayEnd.toISOString()]); //append pair

        currentDay.setDate(currentDay.getDate()   1); //set variable to next day
    }

    return res;
}

var pastWeek = getPastWeek('2021-09-18T20:18:27.000Z'); //call example

CodePudding user response:

The OP code is pretty close, you should have been able to adapt it to your needs. The following employs a similar algorithm. End of day is set to 1ms before midnight.

// Given a UTC ISO 8601 timestamp, return array of day plus 
// previous 6 days with start of day, end of day timestmaps
function getDates(d) {
  let s = new Date(d.slice(0,10));
  let e = new Date( s);
  e.setUTCHours(23,59,59,999);
  let result = [];

  for (let i=7; i; i--) {
    result.push([s.toISOString(), e.toISOString()]);
    s.setUTCDate(s.getUTCDate() - 1);
    e.setUTCDate(e.getUTCDate() - 1);
  }
  return result;
}

console.log(getDates(new Date().toISOString()));

  • Related