Рассчитать общий диапазон дат с или без пробелов - PullRequest
0 голосов
/ 09 января 2020

Я пытаюсь получить общее количество лет в разных диапазонах дат. Это мой код:

function calculate(dates) {
  let total = 0;
  let previousStartYear;
  let previousEndYear;

  dates.forEach(date => {
    let endYear = new Date(date.EndingDate).getFullYear();
    let startYear = new Date(date.StartDate).getFullYear();

    if (previousStartYear && endYear > previousStartYear) {
      total += (endYear - startYear) - (endYear - previousStartYear);
      if (previousEndYear && endYear > previousEndYear) {
        total += (endYear - previousEndYear);
      }
    } else {
      total += endYear - startYear;
    }
    previousStartYear = startYear;
    previousEndYear = endYear;
  })
  return total;
}

// Eample 1
let x1 = calculate([{
    StartDate: '2008-01-01T00:00:00.000Z',
    EndingDate: '2016-01-01T00:00:00.000Z',
  },
  {
    StartDate: '2006-03-01T00:00:00.000Z',
    EndingDate: '2008-01-01T00:00:00.000Z',
  },
  {
    StartDate: '2005-01-01T00:00:00.000Z',
    EndingDate: '2015-11-01T00:00:00.000Z',
  },
  {
    StartDate: '2002-01-01T00:00:00.000Z',
    EndingDate: '2010-01-01T00:00:00.000Z',
  }, ,
  {
    StartDate: '2001-01-01T00:00:00.000Z',
    EndingDate: '2008-11-01T00:00:00.000Z',
  }
])

console.log('Example 1: ' + x1);

let x2 = calculate([ //2
  {
    StartDate: '2019-01-01T00:00:00.000Z',
    EndingDate: '2020-01-01T00:00:00.000Z',
  },
  {
    StartDate: '2017-03-01T00:00:00.000Z',
    EndingDate: '2018-01-01T00:00:00.000Z',
  },
  {
    StartDate: '2007-01-01T00:00:00.000Z',
    EndingDate: '2019-11-01T00:00:00.000Z',
  }
]);

console.log('Example 2: ' + x2)

Первый пример возвращает 22, а второй пример возвращает правильную сумму: 13

Ожидаемый результат должен быть в состоянии рассчитать диапазоны даже с такими пробелами, как как:

2010 - 2011

2009 - 2011 - разрыв

2005 - 2007 - разрыв

2004 - 2008

Я знаю Я пропустил много условий и вычислений, и я не уверен, правильно ли я обработал годы между диапазонами.

Любая помощь будет очень признательна!

1 Ответ

0 голосов
/ 09 января 2020

Ваш лог c, кажется, испорчен, слишком много всего требуется для полного анализа, но вот пара вопросов:

previousStartYear = startYear;

мне кажется, что его следует назначать, только если startYear меньше prevoiusStartYear или previousStartYear не инициализировано. То же самое для previousEndYear = endYear.

Также '2008-01-01T00: 00: 00.000Z' будет анализироваться как UT C, поэтому для пользователей с отрицательным смещением часового пояса new Date('2008-01-01T00:00:00.000Z').getFullYear() вернет 2007, тогда как любая другая дата в году вернет 2008. Вы можете исправить это с помощью getUTCFullYear(), но это может иметь другие последствия.

Если вы просто хотите получить диапазон от самого раннего начального года до самого последнего конца год, затем просто получите самый ранний начальный год и вычтите его из самого последнего конечного года, например

function calculate(data) {
  let o = {};
  data.forEach(obj => {
    // Don't bother with Dates, just get the year from the string
    let start = obj.StartDate.substr(0,4);
    let end = obj.EndingDate.substr(0,4);

    // Initialise o.start and o.end if not already done
    if (!o.start) {
      o.start = start;
      o.end = end;

    // Update values if start earlier or end later
    } else {
      if (start < o.start) o.start = start;
      if (end > o.end) o.end = end;
    }
  });

  // Get difference
  return o.end - o.start;
}


let data1 = [
  {StartDate: '2008-01-01T00:00:00.000Z',
   EndingDate: '2016-01-01T00:00:00.000Z'},
  {StartDate: '2006-03-01T00:00:00.000Z',
   EndingDate: '2008-01-01T00:00:00.000Z'},
  {StartDate: '2005-01-01T00:00:00.000Z',
   EndingDate: '2015-11-01T00:00:00.000Z'},
  {StartDate: '2002-01-01T00:00:00.000Z',
   EndingDate: '2010-01-01T00:00:00.000Z'},
  {StartDate: '2001-01-01T00:00:00.000Z',
   EndingDate: '2008-11-01T00:00:00.000Z'}
];

console.log(calculate(data1)); // 15

let data2 = [
  {StartDate: '2019-01-01T00:00:00.000Z',
   EndingDate: '2020-01-01T00:00:00.000Z'},
  {StartDate: '2017-03-01T00:00:00.000Z',
   EndingDate: '2018-01-01T00:00:00.000Z'},
  {StartDate: '2007-01-01T00:00:00.000Z',
   EndingDate: '2019-11-01T00:00:00.000Z'}
];

console.log(calculate(data2)); // 13
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...