【问题标题】:Calculate number of specific weekdays between dates计算日期之间的特定工作日数
【发布时间】:2014-10-23 02:31:30
【问题描述】:

我正在尝试计算 Tasker 中两个日期之间的星期一、星期三和星期五的数量,因此我需要一个数学公式,可能使用秒形式的日期,即 unix 时间或 javascript 代码。我已经尝试过谷歌搜索并绞尽脑汁寻找任何方法来开始这个,我迷路了,所以我还没有尝试过任何东西。我唯一能想到的就是得到总天数并除以 7,但这显然对我没有多大帮助,特别是如果其中一天或两天是周中。谁能指出我更好的方向?

【问题讨论】:

    标签: javascript date math tasker


    【解决方案1】:

    如何count specific days of the week between two dates in O(1):

    // days is an array of weekdays: 0 is Sunday, ..., 6 is Saturday
    function countCertainDays( days, d0, d1 ) {
      var ndays = 1 + Math.round((d1-d0)/(24*3600*1000));
      var sum = function(a,b) {
        return a + Math.floor( ( ndays + (d0.getDay()+6-b) % 7 ) / 7 ); };
      return days.reduce(sum,0);
    }
    

    在两个日期之间计算周一、周三和周五[1,3,5] 的示例:

    countCertainDays([1,3,5],new Date(2014,8,1),new Date(2014,8,1)) // 1
    countCertainDays([1,3,5],new Date(2014,8,1),new Date(2014,8,2)) // 1
    countCertainDays([1,3,5],new Date(2014,8,1),new Date(2014,8,3)) // 2
    countCertainDays([1,3,5],new Date(2014,8,1),new Date(2014,8,4)) // 2
    countCertainDays([1,3,5],new Date(2014,8,1),new Date(2014,8,5)) // 3
    countCertainDays([1,3,5],new Date(2014,8,1),new Date(2014,8,6)) // 3
    countCertainDays([1,3,5],new Date(2014,8,1),new Date(2014,8,7)) // 3
    

    请注意,Date 的月份参数是从 0 开始的,因此 2014 年 9 月 1 日是 Date(2014,8,1)

    【讨论】:

    • 这非常有用。是否有任何公式可以让我也给出一个日期数组,这些日期将被排除或不会在两个日期之间计算?
    • @Poonam 在这种情况下,只需遍历日期数组,并计算两个日期之间的日期。如果您的情况比这更复杂,请将其作为单独的问题提交。
    【解决方案2】:

    假设总天数为n。那么一周中任何一天的数字最初是n / 7。现在采取n = n % 7。根据当前n 的值,您可以轻松计算最终天数。

    例如:

    假设您的第一天是Friday,总天数是100。所以,n = 100。每个工作日最少有100/714 在区间内。 100 % 7 = 2。所以最终的计数是,

    Friday -> 14+1 = 15
    Saturday -> 14+1 = 15
    Sunday -> 14
    Monday -> 14
    Tuesday -> 14
    Wednesday -> 14
    Thursday -> 14
    

    【讨论】:

    • @HeatherLeigh,如果我可以为您提供您所期望的确切信息,我认为接受答案不会对您造成太大伤害,不是吗?
    • 我需要它自动化(因此使用了 Tasker),因此它可能需要 2 个日期并输出它们之间的星期一、星期三和星期五的数量。
    【解决方案3】:

    如何在 JavaScript 中计算两个日期之间的星期五数

    function myfunction() {
        var frist = document.getElementById("dt_VacStart").value
        var answer = 0;
        var second = document.getElementById("dt_VacEnd").value;
        if (frist != null && second != null) {
            var startDate = new Date(frist);
            var endDate = new Date(second);
            var totalfriday = 0;
            for (var i = startDate; i <= endDate;) {
                if (i.getDay() ==5) {
                    totalfriday++;
                }
                i.setTime(i.getTime() + 1000 * 60 * 60 * 24);
            }
            document.getElementById('<%=Friday.ClientID%>').value = totalfriday;
        } else {
            totalfriday = 0;
            document.getElementById('<%=Friday.ClientID%>').value = totalfriday;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-03
      • 2010-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多