javascript实现找出一个月内的工作日,并格式化打印(不考虑法定节假日)

一、需求

由于公司的工时填报系统需要填写一个月的工作内容,特写出这个脚本来找出某月的工作日,但是姑且不考虑特殊法定节假日的情况。当然该函数并不限定必须是一个月,一段时间的也可以。

二、代码与分析

需要用到JavaScript中的Date类型中的getDay方法来判断某一天是否为周六日,如果getDay为0则为周日,为6则为周六。以下为几个重要的实现函数:

1.将特定的时间字符串转化为Date类型的时间

function stringToDate(dateString) {
  dateString = dateString.split('-');
  return new Date(dateString[0], dateString[1] - 1, dateString[2]);
}

2.格式化时间戳

// 格式化为 2022-10-01
function formatDate(date) {
  let year = date.getFullYear();
  let month = date.getMonth() + 1;
  // 月份小于10,前面补0
  if(month < 10) {
    month = '0' + month;
  }
  let day = date.getDate();
  // 天数小于10,前面补0
  if(day < 10) {
    day = '0' + day;
  }
  return `${year}-${month}-${day}`;
}

3.打印输出某段时间内的所有工作日

function printWorkDay(dateBegin, dateEnd) {
  dateBegin = stringToDate(dateBegin);
  dateEnd = stringToDate(dateEnd);
  totalTime = (dateEnd - dateBegin) / (24 * 3600 * 1000) + 1; // 总天数

  let workDays = [];
  for(let i = 0; i < totalTime; i++) {
    if(dateBegin.getDay() !== 0 && dateBegin.getDay() !== 6) {
      workDays.push(formatDate(dateBegin));
    }
    dateBegin = dateBegin.valueOf()
    dateBegin += 24 * 3600 * 1000; // 加一天
    dateBegin = new Date(dateBegin);
  }
  return workDays;
}

4.测试执行


let workDaysForLoop = printWorkDay('2022-10-01', '2022-10-31'); // workDaysForLoop用于循环提交工作日志,如果遇当月有特殊法定节假日需手动处理特殊日期
// 测试用函数
const test = function (days) {
  let ConfigInfo = {
    authorization: '', //token
    date: days, // 日期
    workContent: '产品需求开发', // 工作内容
  }
  let body = `{"category1":"Other","category2":"其它","projectId":"79e48b87-df9f-4080-bf60-bd1c094b8e3e","date":${ConfigInfo.date},"normalHours":"8","overtimeHours":"","workContent":${ConfigInfo.workContent},"costBearingDepartmentId":"ea462f59-602d-4af4-9931-2c55623b6996","timesheetType":"研发","functionType":"通用功能","associatedSaleProjectId":"b5edb2a6-918d-48d8-8b0b-4668bf5d2b6a","costBearingProductLine":null}`;
  console.log(body)
}

// 一次性提交
let timeID
const sleep = (time) => new Promise((resolve) => {
  timeID = setTimeout(resolve, time);
});

(() => {
  workDaysForLoop.forEach(async (item, index) => {
    await sleep(1000 * index)
    test(item); // 此处处理提交逻辑
  })
})();

clearTimeout(timeID)

三、最终效果展示

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现这个功能需要以下几个步骤: 1. 获取法定节假日列表和调休日列表,这些数据可以从后端接口或者本地存储中获取。 2. 计算起止日期之间的所有日期,并将它们存储在一个数组中。 3. 遍历数组,对于每个日期,判断它是否是周末或者法定节假日或者调休日。如果是,排除它。 4. 最后计算剩余的日期数量,即为工作日的天数。 下面是一个使用 JavaScript 实现的示例代码: ```javascript // 假设法定节假日和调休日的数据分别存储在 holidayList 和 adjustedList 中 function getWorkingDays(startDate, endDate, holidayList, adjustedList) { // 计算起止日期之间的所有日期 const dateList = []; let currentDate = new Date(startDate); while (currentDate <= endDate) { dateList.push(new Date(currentDate)); currentDate.setDate(currentDate.getDate() + 1); } // 排除周末和法定节假日和调休日 let workingDays = 0; dateList.forEach(date => { // 判断是否是周末 if (date.getDay() !== 0 && date.getDay() !== 6) { // 判断是否是法定节假日 const isHoliday = holidayList.some(holiday => { return holiday === date.toISOString().slice(0, 10); }); // 判断是否是调休日 const isAdjust = adjustedList.some(adjust => { return adjust === date.toISOString().slice(0, 10); }); if (!isHoliday || isAdjust) { workingDays++; } } }); return workingDays; } // 调用示例 const holidayList = ["2022-01-01", "2022-01-02", "2022-01-03"]; // 假设法定节假日为2022年元旦 const adjustedList = ["2022-01-08"]; // 假设2022年元旦调休到了2022年1月8日 const startDate = new Date("2022-01-01"); const endDate = new Date("2022-01-10"); const workingDays = getWorkingDays(startDate, endDate, holidayList, adjustedList); console.log(workingDays); // 输出结果为 3,即2022年1月4日、1月5日、1月7日为工作日 ``` 这个示例代码比较简单,实际开发中还需要考虑一些边界情况和优化性能的问题,例如如何提前加载节假日和调休日数据,如何处理时区等问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值