我一直在使用以下代码:

var rangesInputRange1 = [
    { startDate: parseDate("15/04/2024"), endDate: parseDate("01/05/2024") },
    { startDate: parseDate("01/06/2024"), endDate: parseDate("30/06/2024") }
];

var rangesInputRange2 = [
    { startDate: parseDate("01/04/2024"), endDate: parseDate("14/04/2024") },
    { startDate: parseDate("01/07/2024"), endDate: parseDate("31/08/2024") }
];

function parseDate(dateString) {
    var parts = dateString.split("/");
    return new Date(parts[2], parts[1] - 1, parts[0]);
}

function isDateInRanges(date, ranges) {
  return ranges.some(function(range) {
    return date >= range.startDate && date <= range.endDate;
  });
}

function countDaysInRange(startDate, endDate) {
  var oneDay = 24 * 60 * 60 * 1000;
  return Math.round(Math.abs((startDate - endDate) / oneDay));
}

jQuery('#start-date, #end-date').on('change', function() {
  var startDate = parseDate(jQuery('#start-date').val());
  var endDate = parseDate(jQuery('#end-date').val());

  var daysInRange1 = isDateInRanges(startDate, rangesInputRange1) ? countDaysInRange(startDate, endDate) : 0;
  var daysInRange2 = isDateInRanges(startDate, rangesInputRange2) ? countDaysInRange(startDate, endDate) : 0;

  var inputRange1 = jQuery('input.checkbox1');
  var inputNumber1 = jQuery('input.number1');
  var inputRange2 = jQuery('input.checkbox2');
  var inputNumber2 = jQuery('input.number2');

  inputRange1.prop('checked', daysInRange1 > 0).trigger('change');
  inputNumber1.val(daysInRange1).trigger('change');
  inputRange2.prop('checked', daysInRange2 > 0).trigger('change');
  inputNumber2.val(daysInRange2).trigger('change');
});

jQuery('#start-date, #end-date').trigger('change');

如果#Start-Date和#End-Date在相同的范围InputRange,我已成功.在这种情况下,代码运行得很好.

如果所选日期都在两个范围InputRange中,我如何计算天数InRange?(例如:Dates 10/04/2024到17/04/2024)

或所选日期仅部分在一个范围内输入范围?(例如:28/08/2024至03/09/2024).

(日期格式:日/月/年)

推荐答案

更新countDaysInRange功能的代码

function countDaysInRange(startDate, endDate) {
  var daysInRange1 = isDateInRanges(startDate, rangesInputRange1) ? Math.min(countDays(startDate, endDate, rangesInputRange1), 0) : 0;
  var daysInRange2 = isDateInRanges(startDate, rangesInputRange2) ? Math.min(countDays(startDate, endDate, rangesInputRange2), 0) : 0;

  return daysInRange1 + daysInRange2;
}

function countDays(startDate, endDate, ranges) {
  return ranges.reduce(function (totalDays, range) {
    var overlapStartDate = startDate < range.endDate ? startDate : range.startDate;
    var overlapEndDate = endDate < range.endDate ? endDate : range.endDate;

    if (overlapStartDate <= overlapEndDate) {
      return totalDays + Math.round((overlapEndDate - overlapStartDate) / (1000 * 60 * 60 * 24));
    }
    return totalDays;
  }, 0);
}

现在,countDaysInRange函数分别计算这两个范围内的天数,并返回为重叠或范围内期间计算的总天数.

Update

Updated Code

我希望这能有所帮助.

jQuery('#start-date, #end-date').on('change', function() {
  var startDate = parseDate(jQuery('#start-date').val());
  var endDate = parseDate(jQuery('#end-date').val());

  var daysInRange1 = isDateInRanges(startDate, rangesInputRange1) ? countDaysInRange(startDate, endDate, rangesInputRange1) : 0;
  var daysInRange2 = isDateInRanges(startDate, rangesInputRange2) ? countDaysInRange(startDate, endDate, rangesInputRange2) : 0;

  var inputNumber1 = jQuery('input.number1');
  var inputNumber2 = jQuery('input.number2');

  inputNumber1.val(daysInRange1).trigger('change');
  inputNumber2.val(daysInRange2).trigger('change');
});

// Separate countDaysInRange for each range
function countDaysInRange(startDate, endDate, ranges) {
  return ranges.reduce(function(totalDays, range) {
    var overlapStartDate = startDate < range.endDate ? startDate : range.startDate;
    var overlapEndDate = endDate < range.endDate ? endDate : range.endDate;

    if (overlapStartDate <= overlapEndDate) {
      return totalDays + Math.round((overlapEndDate - overlapStartDate) / (1000 * 60 * 60 * 24));
    }
    return totalDays;
  }, 0);
}

Javascript相关问答推荐

在JS中获取名字和姓氏的首字母

我在这个黑暗模式按钮上做错了什么?

我试图实现用户验证的reduxstore 和操作中出了什么问题?

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

网页自检测外部元素无法加载

Next.js(react)使用moment或不使用日期和时间格式

虚拟滚动实现使向下滚动可滚动到末尾

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

Ember.js 5.4更新会话存储时如何更新组件变量

从包含数百行的表中获取更改后的值(以表单形式发送到后端)的正确方法是什么?

TypeError:无法分解';React2.useContext(...)';的属性';basename';,因为它为空

如何将innerHTML字符串修剪为其中的特定元素?

映射类型定义,其中值对应于键

删除加载页面时不存在的元素(JavaScript)

ngOnChanges仅在第二次调用时才触发

自动滚动功能在当前图像左侧显示上一张图像的一部分

用另一个带有类名的div包装元素

是否设置以JavaScript为背景的画布元素?

如何在Java脚本中并行运行for或任意循环的每次迭代

输入数据覆盖JSON文件