0

So I need to calculate a set of time intervals like this: [8:00 - 8:10] I decided to use a Date type for this and wrote this piece of code to test things:

let todaysDate = new Date();
let startTime: Date = new Date(todaysDate.setHours(5, 0, 0));
let endTime: Date = new Date(todaysDate.setHours(6, 0, 0));
let start : number = startTime.getTime();
let interval: number = 600000;

let firstTime = new Date(startTime.getTime());
let secondTime = new Date(startTime.getTime() + interval);

let timeIntervalsArray: Date[][] = [];

while (secondTime.getTime() < endTime.getTime()) {
    firstTime.setTime(start);
    secondTime.setTime(firstTime.getTime() + interval);

    const times: Date[] = [firstTime, secondTime];
    timeIntervalsArray.push(times);
    start += interval;
}

console.log(timeIntervalsArray);

But when logging the timeIntervalsArray variable I get that all variables in array are the same:

[LOG]: 
[[Date: "2023-04-22T05:50:00.722Z", Date: "2023-04-22T06:00:00.722Z"], 
[Date: "2023-04-22T05:50:00.722Z", Date: "2023-04-22T06:00:00.722Z"], 
[Date: "2023-04-22T05:50:00.722Z", Date: "2023-04-22T06:00:00.722Z"], 
[Date: "2023-04-22T05:50:00.722Z", Date: "2023-04-22T06:00:00.722Z"], 
[Date: "2023-04-22T05:50:00.722Z", Date: "2023-04-22T06:00:00.722Z"], 
[Date: "2023-04-22T05:50:00.722Z", Date: "2023-04-22T06:00:00.722Z"]]

I managed to fix this behavior by changing this line: const times: Date[] = [firstTime, secondTime]; to this: const times: Date[] = [new Date(firstTime), new Date(secondTime)];

But I don't understand how this works, as if I log as such:

while (secondTime.getTime() < endTime.getTime()) {
    firstTime.setTime(start);
    secondTime.setTime(firstTime.getTime() + interval);

    //Logging firstTime
    console.log(firstTime);
    console.log('As new date', new Date(firstTime));
    //

    const times: Date[] = [firstTime, secondTime];
    timeIntervalsArray.push(times);
    start += interval;
}

I get the same Data object:

[LOG]: Date: "2023-04-22T05:00:00.718Z" 
[LOG]: "As new date",  Date: "2023-04-22T05:00:00.718Z" 

What is more odd - when logging the timeIntervalsArray itself:

while (secondTime.getTime() < endTime.getTime()) {
    firstTime.setTime(start);
    secondTime.setTime(firstTime.getTime() + interval);

    //Logging timeInterval
    console.log(timeIntervalsArray);
    //
    
    const times: Date[] = [firstTime, secondTime];
    timeIntervalsArray.push(times);
    start += interval;
}
Fist iteration : [LOG]: [] -> array is empty 
Second iteration : 
[LOG]: [[Date: "2023-04-22T05:10:00.241Z", Date: "2023-04-22T05:20:00.241Z"]] 
-> array has one element - [Date: "2023-04-22T05:10:00.241Z", Date: "2023-04-22T05:20:00.241Z"]

Third iteration : 
[LOG]: [[Date: "2023-04-22T05:20:00.241Z", Date: "2023-04-22T05:30:00.241Z"], 
[Date: "2023-04-22T05:20:00.241Z", Date: "2023-04-22T05:30:00.241Z"]] 
-> the fist element has been changed to 
[Date: "2023-04-22T05:20:00.241Z", Date: "2023-04-22T05:30:00.241Z"]
but it was 
[Date: "2023-04-22T05:10:00.241Z", Date: "2023-04-22T05:20:00.241Z"]

Can somebody explain this behavior because I am out of ideas...

Anton
  • 9
  • 1
  • 2
    "*I get that all variables in array are the same*" - yes precisely, they **are** all the same object. Your code only creates two `new Date` objects. `setTime` changes the existing object, and there is no operation to copy them. You already discovered the fix: `const times: Date[] = [new Date(firstTime), new Date(secondTime)];` does create new objects. – Bergi Apr 22 '23 at 20:42
  • Well yes, I change the existing object, but then I push it to the array. How can an object in array be changed after it was added to the array? – Anton Apr 22 '23 at 21:09
  • Because they hold a reference to it. firstTime and secondTime are still referencing to these objects in the array. You are putting the same object 6 times in the array and you are updating this object 6 times. And it's showing your last setTime. You can log your array in the loop and you will see it. -> console.log(JSON.stringify(timeIntervalsArray)) – GarfieldKlon Apr 22 '23 at 21:10
  • @Anton Adding something to an array does not copy it. It's still a reference to the *same* object, the object that you're changing later – Bergi Apr 22 '23 at 21:55

0 Answers0