如何从日期范围(开始日期和结束日期)生成每周列表?

时间:2019-08-12 18:47:42

标签: javascript datetime

我的开始日期为任何月份的星期一,结束日期为任何月份的星期日。我需要介于日期之间的周列表。例如我选择开始日期为08/12/2019,结束日期为09/08/2019。作为输出,需要周列表。所以

{[08/12/2019,08/13/2019,08/14/2019,08/15/2019,08/16/2019,08/17/2019,08/18/2019],[08/19/2019,08/20/2019,08/21/2019,08/22/2019,08/23/2019,08/24/2019,08/25/2019],[08/26/2019,08/27/2019,08/28/2019,08/29/2019,08/30/2019,08/31/2019,09/01/2019],[09/02/2019,09/03/2019,09/04/2019,09/05/2019,09/06/2019,09/07/2019,09/08/2019]}

在react hook / js中需要。

var start = new Date("08/12/2019");
var end = new Date("09/08/2019");
var newStart = start.setDate(start.getDate()+7);

var days = [];
for (var d = begin; d <= newStart; d = d + 1) {
   days.push(new Date(d));
 }

这只能使用1周,没有太大帮助。

2 个答案:

答案 0 :(得分:0)

您可以使用嵌套循环扩展解决方案:

const start = new Date("2019-08-12");
const end = new Date("2019-09-08");

const DAY = 24 * 60 * 60 * 1000;

const weeks = [];
for (let newStart = start.valueOf(); newStart < end; newStart += DAY * 7) {
  const days = [];
  for (let d = newStart; d < newStart + 7 * DAY; d += DAY) {
    days.push(new Date(d));
  }
  weeks.push(days);
}

console.log(weeks);

注意:

  • 我将标准Date Time String Format YYYY-MM-DD用于UTC的零时偏移,以避免随机的时偏移
    • new Date(d).toJSON().slice(0, 10)会将日期转换为这种格式的字符串
  • 我使用.valueOf()将日期转换为数字,以实现+运算符的正确行为
    • 请注意,带有日期对象的d + 1会将其转换为字符串并将其与'1'连接,因此我将d用作数字以确保+是一个数字加
    • d += DAYd = d + DAY
  • 我在for中使用let来实现适当的块作用域(var将在函数作用域中声明变量)
  • 我没有处理极端情况(不同类型,而不是日期,无限结束,星期几错误...)

答案 1 :(得分:0)

第二种简单的方法如下所示,您无需使用双循环。

function getWeeks(startDate, endDate){
  var sd = new Date(startDate);
var weeks = [];
  var week = [];
  var weekCounter = 1; // you can remove this
for (var d = sd; d <= new Date(endDate); d.setDate(d.getDate() + 1)) {
    week.push(new Date(d).getMonth()+1 +'/'+new Date(d).getDate()+'/'+new Date(d).getFullYear());
  if(new Date(d).getDay() == 0)
    {
      weeks.push("Week"+weekCounter + ":"); // you can remove this
      weeks.push(week); 
      weekCounter++; // you can remove this
      week = [];
    }
}
  return weeks;
}
console.log(getWeeks('08/12/2019','09/08/2019'));