Как реализовать функциональность EDATE () MS-excel в JAVASCRIPT - PullRequest
0 голосов
/ 06 августа 2020

Мне нужно реализовать EDATE функциональность MS-Excel в JAVASCRIPT

образец:

EDATE (06-Aug-2020,13)

Результат: 06 -Сентябрь-2021

1 Ответ

0 голосов
/ 06 августа 2020

Такого функционала нет, вы должны собрать его самостоятельно.

Сначала я генерирую из вашей строки JS -date. Из этого я извлекаю год, месяц и день.
Затем я суммирую дополнительные месяцы и получаю месяц по модулю 12 (месяцы в JS считаются 0-11). Если месяцы отрицательные, я добавляю 12 месяцев. Для года я добавляю целую часть от monthSum didide до 12.
Если день больше или равен 29, и это февраль и это високосный год (год по модулю 4 равен 0), то для дня устанавливается значение 29. Во всех остальных случаях случаях, день устанавливается на минимум привилегированного дня и максимум дней в этом месяце (хранится в массиве MONTH).
Теперь у меня есть желаемая дата, и я только форматирую ее для возврата: для получения дня с 2- di git добавить перед строкой «0», а затем взять последние 2 символа. Для сокращения месяца я использую массив MONTH.

Попробуйте. Я даю вам несколько важных примеров с високосным днем ​​и с отрицательными / положительными месяцами, которые приводят к смене года.

function edate(dateString, monthExtra) {
  const DAYS = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
  const MONTH = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];

  let date = new Date(dateString);
  let year= -date.getFullYear();
  let month = date.getMonth();
  let day = date.getDate();
  
  let monthSum = month + monthExtra;
  
  month = monthSum %12;
  if (month < 0) {
    month = 12 + month;
  }

  year = year +  Math.floor(monthSum/12);
  
  if ( day>=29 && month==1 && (year %4 == 0 )) {
    day = 29;
  } else {
    day = Math.min(day, DAYS[month]);
  }

  return ("0" + day).slice(-2) + '-' + MONTH[month] + '-' + year;
}

console.log(edate('06-Aug-2020', 13));
console.log(edate('30-Jan-2020', -13));
console.log(edate('30-Jan-2019', 1));
console.log(edate('29-Mar-2020', -13));
...