繁体   English   中英

如何使用 JavaScript 查找当月的工作日数?

[英]How can I find the number of business days in the current month with JavaScript?

如何创建一个 function 来查找当月的工作日(工作日)数? 您可以在没有jQuery的情况下编写简单的 JavaScript 代码吗?

    function daysInMonth(iMonth, iYear)
    {
        return 32 - new Date(iYear, iMonth, 32).getDate();
    }

    function Detail()
    {
        var d = new Date();
        var year = d.getFullYear();
        var month = d.getMonth();
        var dim = daysInMonth(month, year);
        alert(dim);
    }

    function Businessday(iMonth, iYear)
    {
        // Enter code here
    }

    function isBusinessDay()
    {
        var d = new Date();
        var day = d.getDay();
        switch(day) {
            case 0:
                document.write("Today is weekend");
            break;

            case 6:
                document.write("Today is weekend");
                break;

            default:
                document.write("Today is a business day");
        }
    }

好的,让我们一次解决这个问题。

JavaScript 中的Date对象有一个方法getDay 这将在星期日返回 0,星期一返回 1,星期二返回 2,星期六返回 6。 鉴于此,我们可以得出结论,我们不想计算getDay返回 0 或 6 的天数。

您已经有一个函数来返回一个月中的天数,因此假设我们可以遍历所有天数并检查 getDay 的结果。 daysInMonth假设月份是从零开始的; 所以 0 = 一月。

我鼓励你从这里尝试自己解决这个问题; 否则请继续阅读。


让我们从isWeekday函数开始。 我们需要年、月和日:

function isWeekday(year, month, day) {
var day = new Date(year, month, day).getDay();
return day !=0 && day !=6;
}

我们完全按照上面所说的做:我们构造一个 Date,并使用getDay来确定它是否是一天。

现在我们需要遍历一个月中的所有天数:

function getWeekdaysInMonth(month, year) {
var days = daysInMonth(month, year);
var weekdays = 0;
for(var i=0; i< days; i++) {
    if (isWeekday(year, month, i+1)) weekdays++;
}
return weekdays;
}

我们遍历一个月中的所有日子。 我们在检查isWeekday时加 1,因为与月份不同,这一天是基于 1 的。 如果是,我们增加weekdays ,然后返回。

所以我们可以像这样使用getWeekdaysInMonth

var weekdays = getWeekdayInMonth(9, 2011); //9 = October.

这将导致 21。

带链接的箭头函数样式:

(
    (year, month) => 
        new Array(32 - new Date(year, month, 32).getDate())
        .fill(1)
        .filter(
            (id, index) =>
                [0, 6].indexOf(
                    new Date(year, month, index + 1).getDay()) === -1
                ).length
)(2017, 5)

如果你不想每个月的每一天都迭代,下面的代码应该可以解决问题

const atMost = (n, max) => (n > max? max : n)
  
function workdaysOfMonth(year, month){
    var targetMonthStart = new Date(year, month-1)
    var targetMonthEnd = new Date(year, month, 0)
    return Math.floor(targetMonthEnd.getDate()/7) * 5
        + (atMost(6-targetMonthStart.getDay(), 5) + atMost(targetMonthEnd.getDay(), 5)) % 5
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM