我有一个简单的Java函数,可以计算两个日期之间的周数,每七天等于一周:

function getWeeksDiff(startDate, endDate) {
  const msInWeek = 1000 * 60 * 60 * 24 * 7;

  return Math.round(Math.abs(endDate - startDate) / msInWeek);
}

它工作正常,但现在我想改变逻辑.我想从每周一到周六休息一周,不管是哪一天,这和7天没有严格的关系

例如:今天是11月23日,所以24、25、26和27必须算1周,从周一28到周日4必须算两周,所以我的逻辑是这样的:

const week = 1000 * 60 * 60 * 24 * 7;
const day = 24 * 60 * 60 * 1000;

  function weeksBetween(startDate, endDate) {
             return Math.ceil((weekStart(endDate) - weekStart(startDate)) / week) + 1;
         }

 function weekStart(dt) {
     const weekday = dt.getDay();
     return new Date(dt.getTime() - Math.abs(0 - weekday) * day);
 }

但出于某种原因,每个星期天它都会多计算一周,例如,27日星期天已经向我显示了两周而不是一周:

const week = 7 * 24 * 60 * 60 * 1000;
const day = 24 * 60 * 60 * 1000;

function weekStart(dt) {
    const weekday = dt.getDay();
    return new Date(dt.getTime() - Math.abs(0 - weekday) * day);
}

function weeksBetween(d1, d2) {
    return Math.ceil((weekStart(d2) - weekStart(d1)) / week)+1;
}

console.log(weeksBetween(new Date("11/23/2022"), new Date("11/27/2022")));

推荐答案

function countWeeks(startDate, endDate) {
    // Calculate the next Sunday from the startDate 
    // Change the 0 if you need a different day to start the week
    const firstWeek = startDate.getDate() + (7 + 0 - startDate.getDay()) % 7;
    const newStartDate = new Date(startDate.setDate(firstWeek));

    // Remove that partial week and calculate how many partial weeks remaining
    return Math.ceil((endDate-newStartDate)/1000/60/60/24/7) + 1;

}

const date1 = new Date('11/20/2022');
const date2 = new Date('11/27/2022');
console.log(countWeeks(date1, date2)); // 2

const date3 = new Date('11/1/2022');
const date4 = new Date('11/29/2022');
console.log(countWeeks(date3, date4)); // 5

应得学分:https://codereview.stackexchange.com/questions/33527/find-next-occurring-friday-or-any-dayofweek

Javascript相关问答推荐

Cypress -使用commands.js将数据测试id串在一起失败,但在将它们串在一起时不使用命令有效

如何才能拥有在jQuery终端中执行命令的链接?

InDesign—创建一个独立的窗口,在文档中进行更正时保持打开状态

D3 Scale在v6中工作,但在v7中不工作

在Vite React库中添加子模块路径

我们如何从一个行动中分派行动

在Three JS中看不到补间不透明度更改效果

加载背景图像时同步旋转不显示的问题

在JS中拖放:检测文件

我正在建立一个基于文本的游戏在react ,我是从JS转换.我怎样才能使变量变呢?

JS:XML insertBefore插入元素

当用户点击保存按钮时,如何实现任务的更改?

JavaScript将字符串数字转换为整数

FindByIdAndUpdate在嵌套对象中创建_id

更新文本区域行号

错误400:当我试图在React中使用put方法时,该字段是必需的

单击时同时 Select 和展开可访问的行

在一次操作中使用多个addToSet不适用于多个数组

Iterator.Next不是进行socket.end()调用后的函数

更改所有验证组件文本和背景 colored颜色