Вывести день, месяц, недели между датами JS

Дана задача написать функцию, которая будет возвращать разницу между двумя датами, выглядит следующим образом условие

console.log(countBetweenTwoDays('03/22/22', '05/25/22'));
// Output The difference between dates is: 64 day(-s), 9 week(-s), 2 month(-s)

Я написал функцию

function countBetweenTwoDays(startDate, endDate) {
  let difference = new Date(new Date(endDate).getTime() - new Date(startDate).getTime()).getTime();
  let days = parseInt(difference / (1000 * 60 * 60 * 24));
  let weeks = parseInt(difference / (1000 * 7 * 60 * 60 * 24));
  let months = parseInt(difference / (1000 * 60 * 60 * 24 * 24));
  
  return `The difference between dates is: ${days} day(-s), ${weeks} week(-s), ${months} month(-s)`;
}

console.log(countBetweenTwoDays('03/22/22', '05/25/22'));
// Output The difference between dates is: 64 day(-s), 9 week(-s), 2 month(-s)

Вопрос:

  1. Что я сделал не так в расчёте дней, почему я получил 63 дня вместо 64 (переменная days)?
  2. Мне кажется что я совершенно неправильно составил формулу для расчёта месяцев (переменная month).

Ответы (1 шт):

Автор решения: EzioMercer

Если честно не очень понял как именно вы хотите округлять. В вашем случае parseInt работает как Math.floor(), но я бы использовал Math.ceil(), а вам похоже нужно Math.round(). Ниже простая реализация без учёта того что в разных месяцах разное кол-во дней и это может привести в неверным ответам:

const countBetweenTwoDays = (startDate, endDate) => {
  const diffInMS = new Date(endDate).getTime() - new Date(startDate).getTime();
  
  const diffInDays = diffInMS / 1000 / 60 / 60 / 24;
  
  const diffInWeeks = diffInDays / 7;
  
  const diffInMonth = diffInDays / 30;
  
  console.log([diffInMS, diffInDays, diffInWeeks, diffInMonth]);
  
  return `The difference between dates is: ${Math.round(diffInDays)} day(-s), ${Math.round(diffInWeeks)} week(-s), ${Math.round(diffInMonth)} month(-s)`;
}


console.log(countBetweenTwoDays('03/22/22', '05/25/22'));

→ Ссылка