You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何生成指定年月的工作日数组(剔除周六周日)

嘿,这个需求我之前也碰到过,核心逻辑其实挺清晰的:遍历指定月份的所有日期,筛选出周一到周五的日期号,最后把这些日期存进数组就搞定了。下面给你分享几种常用语言的实现方式,你可以按需选用:

核心思路

不管用哪种语言,步骤都是这几步:

  • 获取指定年月的第一天和最后一天
  • 遍历该区间内的每一天
  • 判断当天是否为工作日(周一至周五)
  • 收集符合条件的日期号到数组

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:22:50