назад до уроку

Який день місяця був багато днів тому?

важливість: 4

Створіть функцію getDateAgo(date, days), щоб повернути день місяця, який був days днів після date.

Наприклад, якщо сьогодні – 20-й, то getDateAgo(new Date(), 1) має бути 19-го, а getDateAgo(new Date(), 2) має бути 18-го.

Має працювати надійно для days = 365 або більше:

let date = new Date(2015, 0, 2);

alert( getDateAgo(date, 1) ); // 1, (1 січня 2015)
alert( getDateAgo(date, 2) ); // 31, (31 грудня 2014)
alert( getDateAgo(date, 365) ); // 2, (2 січня 2014)

P.S. Функція не повинна змінювати date.

Відкрити пісочницю з тестами.

Ідея проста: відняти від date дане число кількості днів:

function getDateAgo(date, days) {
  date.setDate(date.getDate() - days);
  return date.getDate();
}

…Але функція не повинна змінювати date. Це важливо, тому що зовнішній код, який дає нам дату, не очікує, що вона зміниться.

Щоб реалізувати це, клонуймо дату, наступним чином:

function getDateAgo(date, days) {
  let dateCopy = new Date(date);

  dateCopy.setDate(date.getDate() - days);
  return dateCopy.getDate();
}

let date = new Date(2015, 0, 2);

alert( getDateAgo(date, 1) ); // 1, (1 січня 2015)
alert( getDateAgo(date, 2) ); // 31, (31 грудня 2014)
alert( getDateAgo(date, 365) ); // 2, (2 січня 2014)

Відкрити рішення із тестами в пісочниці.