如何在JS中每周汇总天的数组?

时间:2019-11-01 22:26:30

标签: javascript node.js date momentjs aggregate

例如,将时间范围从05/10/2019到05/25/2019。

此时间间隔上的日期需要这样汇总(为简便起见,省略了{2019):

const result = [
  [                                    '05-10', '05-11', '05-12'], // week 1
  ['05-13', '05-14', '05-15', '05-16', '05-17', '05-18', '05-19'], // week 2
  ['05-20', '05-21', '05-22', '05-23', '05-24', '05-25'         ], // week 3
];

用JS解决此问题的最佳方法是什么?
是否可以通过在任何一天设置一周的开始来实现此目标?
软件包momentmoment-range会对此有所帮助吗?

2 个答案:

答案 0 :(得分:1)

您可以查看日期,如果日期是1(星期一),请在结果中创建new Array

const startDate = new Date('05-10-2019'),
    endDate = new Date('05-25-2019'),        
    result = [];

function _twoDigits(x) {
  return String(x).padStart(2, '0');
}

let tmp = startDate;
do {
  if (tmp.getDay() === 1 || result.length === 0) {
    // Create a week Array
    result.push([]);
  }
  const str = `${_twoDigits(tmp.getMonth() + 1)}-${_twoDigits(tmp.getDate())}`;
  // Add this date to the last week Array
  result[result.length - 1].push(str);
  // Add 24 hours
  tmp = new Date(tmp.getTime() + 86400000);
} while (tmp.getTime() <= endDate.getTime());

console.log(result);

  

注意:MomentJS可能会有所帮助,但这是一个很大的库。如果您只需要对日期进行2或3个基本操作,我建议您不要使用它。如果您需要对日期进行大量处理,那么可以,它是一个功能强大的库,可为您节省大量时间。

答案 1 :(得分:1)

如果您对moment.js代码感兴趣,这是一种可能的实现方式。

但是正如blex所说的那样,它是一个很大的库。

const start = moment('2019-05-10');
const end = moment('2019-05-25');
const array = [[]];
const from_date = moment(start).startOf('isoWeek');
const to_date = moment(end).endOf('isoWeek');

let j = 0;
let added = 0;
for (let currentDate = moment(from_date); currentDate <= to_date; currentDate.add(1, 'day')) {
  if (added === 7) {
    array.push([]);
    j++;
    added = 0;
  }
  if (currentDate.isBetween(start, end, null, '[]')) {
    array[j].push(currentDate.format('MM-DD'));
  }
  else {
    array[j].push('');
  }
  added++;
}
document.getElementById('output').innerText = JSON.stringify(array);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>

<p id="output"></p>