如何生成指定年月的工作日数组(剔除周六周日)
嘿,这个需求我之前也碰到过,核心逻辑其实挺清晰的:遍历指定月份的所有日期,筛选出周一到周五的日期号,最后把这些日期存进数组就搞定了。下面给你分享几种常用语言的实现方式,你可以按需选用:
核心思路
不管用哪种语言,步骤都是这几步:
- 获取指定年月的第一天和最后一天
- 遍历该区间内的每一天
- 判断当天是否为工作日(周一至周五)
- 收集符合条件的日期号到数组
Python 实现
Python的datetime模块对日期处理非常友好,代码简洁易懂:
import datetime def get_workdays(year, month): workdays = [] # 构造当月第一天的日期对象 first_day = datetime.date(year, month, 1) # 计算当月最后一天:下个月第一天减1天 if month == 12: next_month_first = datetime.date(year + 1, 1, 1) else: next_month_first = datetime.date(year, month + 1, 1) last_day = next_month_first - datetime.timedelta(days=1) # 遍历当月每一天 current_day = first_day while current_day <= last_day: # weekday()返回0=周一,4=周五,只要<=4就是工作日 if current_day.weekday() <= 4: workdays.append(current_day.day) current_day += datetime.timedelta(days=1) return workdays # 测试示例:2018年3月 print(get_workdays(2018, 3)) # 输出结果:[1, 2, 5, 6, 7, 8, 9, 12, 13, 14, 15, 16, 19, 20, 21, 22, 23, 26, 27, 28, 29, 30]
小提示:如果习惯用ISO标准的周几(1=周一,7=周日),可以换成isoweekday()方法,此时判断条件改成current_day.isoweekday() <= 5就行,效果完全一致。
JavaScript 实现
如果是前端或者Node.js环境,用原生Date对象也能轻松实现:
function getWorkdays(year, month) { const workdays = []; // 注意:JavaScript的月份是从0开始计数的,所以要把传入的月份减1 const firstDay = new Date(year, month - 1, 1); // 传入0作为日期参数,会自动返回上月的最后一天,刚好是当前月的最后一天 const lastDay = new Date(year, month, 0); let currentDay = new Date(firstDay); while (currentDay <= lastDay) { // getDay()返回0=周日,6=周六,排除这两个就是工作日 const dayOfWeek = currentDay.getDay(); if (dayOfWeek !== 0 && dayOfWeek !== 6) { workdays.push(currentDay.getDate()); } // 日期加1天,继续循环 currentDay.setDate(currentDay.getDate() + 1); } return workdays; } // 测试示例:2018年3月 console.log(getWorkdays(2018, 3)); // 输出结果:[1, 2, 5, 6, 7, 8, 9, 12, 13, 14, 15, 16, 19, 20, 21, 22, 23, 26, 27, 28, 29, 30]
额外补充
上面的代码只排除了周六周日,如果需要考虑法定节假日,你可以额外维护一个包含节假日日期的数组,在遍历的时候多加一层判断,排除这些特殊日期即可。另外,这个核心逻辑可以轻松迁移到其他语言(比如Java、C#等),只需要对应调整日期处理的API就行。
内容的提问来源于stack exchange,提问作者Herick
相关产品推荐
相关产品推荐

