将日期设置为从今天起 7 个工作日(不包括周末和公众假期)

2023-11-29

我尝试将日期设置为从今天算起 7 个工作日(不包括周末和英国公共假期)。

  1. 我首先将默认日期设置为今天的日期 (todaysDate) + 7 天 (todayPlusSevenDays)
  2. 然后我计算todaysDate 和todayPlusSevenDays 之间的周末天数 如果我找到任何我将它们添加到todayPlusSevenDays
  3. 然后我检查公共假期,如果找到的话我也会添加它们

执行这些检查后,我现在已在默认日期中添加了额外的天数 - 我如何检查新的天数范围是否包含周末或公共假期?

例如,如果默认日期变成周末或银行假日,它还应该添加更多天数(目前还没有)。

到目前为止,这是我的代码:https://jsfiddle.net/7yxna052/

function prepopulateDropdown() {
    var todaysDate = new Date(),
        tempNewDate = new Date(),
        todayPlusSevenDays,
        numberOfWeekends,
        todayPlusSevenDaysPlusWeekends,
        currentHour = todaysDate.getHours(),
        holidayCount = 0,
        weekendDayCount = 0,
        ukHolidays = ['2017-05-12','2017-05-29','2017-08-28','2017-12-25','2017-12-26'];

    // check if current time < or > 6pm GMT
    function setDefaultdDate(){
     if(currentHour >= 18){
           todayPlusSevenDays = new Date(tempNewDate.setDate(tempNewDate.getDate() + 7));
       }
       else{
           todayPlusSevenDays = new Date(tempNewDate.setDate(tempNewDate.getDate() + 6));
       }
    }
    setDefaultdDate();

    // Weekend day count
    function calculateWeekendDays(startDate, endDate){
        while(startDate < endDate){
            startDate.setDate(startDate.getDate() + 1);
            if(startDate.getDay() === 0 || startDate.getDay() == 6){
                ++weekendDayCount ;
            }
        }
        return weekendDayCount;
    }
    calculateWeekendDays(todaysDate, todayPlusSevenDays);

    todayPlusSevenDaysPlusWeekends = new Date(tempNewDate.setDate(tempNewDate.getDate() + weekendDayCount));



    // count UK bank holidays within todayPlusSevenDays
    function calculateBankHolidays(startDate, endDate){
      startDate.setHours(0,0,0,0);
      endDate.setHours(0,0,0,0);

      for(i=0; i < ukHolidays.length; i++){
        ukHolidaysFormated = new Date(ukHolidays[i]).setHours(0,0,0,0);
        d = new Date(ukHolidays[i]).getDay();

        if (ukHolidaysFormated >= startDate && ukHolidaysFormated <= endDate && !(d == 0 || d == 6)) {
           holidayCount++;
        }
      }
      return holidayCount;
    }
    calculateBankHolidays(todaysDate, todayPlusSevenDaysPlusWeekends);

    todayPlusSevenDaysPlusWeekends = new Date(todayPlusSevenDaysPlusWeekends.setDate(todayPlusSevenDaysPlusWeekends.getDate() + holidayCount));


    // set date to prepopulate
    var today = new Date();
    var year = todayPlusSevenDaysPlusWeekends.getFullYear();
    var month = '0' + (todayPlusSevenDaysPlusWeekends.getMonth() + 1);
    var day = todayPlusSevenDaysPlusWeekends.getDate();

    $('.slctDay option').each(function(){
        if($(this).val() == day){
            $(this).attr('selected','selected');
        }
    });
    $('.slctMonth option').each(function(){
        if($(this).val() == month){
            $(this).attr('selected','selected');
        }
    });
    $('.slctYear option').each(function(){
        if($(this).val() == year){
            $(this).attr('selected','selected');
        }
    });
}

这是 @andi 正在讨论的一个例子。我把它作为一个计算器对象。

var calculator = {
    workDaysAdded: 0,
    ukHolidays: ['2017-05-12','2017-05-29','2017-08-28','2017-12-25','2017-12-26'],
    startDate: null,
    curDate: null,

    addWorkDay: function() {
        this.curDate.setDate(this.curDate.getDate() + 1);
        if(this.ukHolidays.indexOf(this.formatDate(this.curDate)) === -1 && this.curDate.getDay() !== 0 && this.curDate.getDay() !== 6) {
            this.workDaysAdded++;
        }
    },

    formatDate: function(date) {
        var day = date.getDate(),
            month = date.getMonth() + 1;

        month = month > 9 ? month : '0' + month;
        day = day > 9 ? day : '0' + day;
        return date.getFullYear() + '-' + month + '-' + day;
    },

    getNewWorkDay: function(daysToAdd) {
        this.startDate = new Date();
        this.curDate = new Date();
        this.workDaysAdded = 0;
        
        while(this.workDaysAdded < daysToAdd) {
            this.addWorkDay();
        }
        return this.curDate;
    }
}

var newWorkDay7 = calculator.getNewWorkDay(7);
var newWorkDay9 = calculator.getNewWorkDay(9);
var newWorkDay14 = calculator.getNewWorkDay(14);
console.log(newWorkDay7);
console.log(newWorkDay9);
console.log(newWorkDay14);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将日期设置为从今天起 7 个工作日(不包括周末和公众假期) 的相关文章

  • JavaScript 中的 ParseFloat 函数

    当我添加两个文本框值时1 001 and 0 001然后我做了一个parseFloat I get 1 0019999999 我要它1 002 你能帮助我吗 JavaScriptNumber http www w3schools com j
  • 如何在D3节点中放置图像?

    到目前为止 我已经创建了这些 D3 节点 用于创建可折叠的层次树 到目前为止 这些节点的颜色为 AA1C1C 深红色 以表明如果您单击它们 它们将扩展到更多节点 我想要做的是在节点中使用图像中的位置 这对于所有用户来说都是一个加号 以知道它
  • 按住鼠标时 JavaScript 重复动作

    是否有一个 JavaScript 函数每隔如此多的毫秒重复一次 以至于按住 html 按钮 如果这可以使用标准 JavaScript 来完成 那就太好了 但使用 jQuery 或 jQuery 插件也很棒 On the mousedown
  • javascript中.match和.test有什么区别[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 在浏览 JavaScript 时 我刚刚遇到了 match test 和 exec有什么不同 这是最快的 首先 exec and test
  • 在选择下拉列表中选择特定选项时添加输入框

    我需要在选择选项时将输入添加到选择选项中 每当用户选择 其他 时 就会出现一个输入框供用户输入数据 HTML
  • console.log 是如何工作的?

    第一个例子 在以下示例中 http jsfiddle net maniator ScTAW 4 http jsfiddle net maniator ScTAW 4 我有这个js var storage function var store
  • HTML5 Audio Element 无法在 IOS 11 设备上的 safari 中播放 mp3 直播

    我是一家广播公司的网络开发人员 自 iOS 11 发布以来 我们收到了一些用户投诉 称我们的音频直播流无法再在 IOS 11 设备上播放 为了将流嵌入我们的网站 我们使用 HTML5 AudioElement 在 iOS 11 的 iPho
  • 获取 Firebase AngularFire 中项目的索引 ID

    这里提出了类似的问题 但接受的答案并没有真正回答这个问题 使用 AngularFire 是否可以创建关系型数据库 或者访问 UniqueID https stackoverflow com questions 16879484 using
  • 代理阻止网络套接字?如何绕行

    我有一个用 Python 编写的正在运行的 websocket 服务器 来自https github com opiate SimpleWebSocketServer https github com opiate SimpleWebSoc
  • jQuery 单击位于另一个 div 之上的 div

    我的 jQuery 有问题click当选择器是 a 时div那是在另一个之上div正如这里所看到的 the html div div div div css parent background color red width 100px h
  • 如何在 d3.js 中填充 svg 圆圈内的图像

    这是我在 svg 中填充圆圈的代码 var svgContainer d3 select body append svg attr width 1000 attr height 1000 var circles svgContainer s
  • 是否可以全局文本对齐表列而不在每行中指定类?

    想知道提高效率的最佳方法是什么 也许使用 jQuery 我可以接受不兼容 ie7 的解决方案 如果需要的话 即使缺乏对 ie8 的支持也可以 table th td class cal center td td left td td cla
  • IE8 上 json 解析失败

    json gt 返回的响应 msg div p Unfortunately we were unable to process your application p br Please upload a CV br div status e
  • LINQ SingleOrDefault() 等效项

    在 Typescript 中 我经常使用这种模式 class Vegetable constructor public id number public name string var vegetable array new Array
  • 掩码输入数字 - 百分比

    如何通过 jQuery 创建具有百分比的数字掩码输入 我是否让输入仅接受三个数字 并在用户完成输入时在数字后添加百分号 keyup 我不使用插件 例子 1 Or 30 Or 99 Or 100 Or 200
  • ExtJS:简单表单忽略 formBind

    我有一个小问题让我发疯了好几天 我有一个表单面板 Ext define EC view PasswordPanel extend Ext form Panel alias widget pwdpanel bodyPadding 15 ini
  • 显示对象内容 - JS/jQuery

    With this data events 返回 object Object 我需要看看里面到底发生了什么 我找到了这个 var Finder each this data events function i n Finder Name i
  • 如何使用 jquery 生成并附加随机字符串

    一般性 我想使用 jQuery 或 javascript 将随机字符串附加到元素的属性 规格 我需要引用 CDN 上的 CSS 文件 不幸的是 每次更新该 CSS 文件时 CDN 都会更改该文件的 URL 所以我不能简单地引用静态 URL
  • JavaScript:如何在 Internet Explorer 中模拟更改事件(委托)

    UPDATE 回顾 小提琴和赏金 这个问题并没有引起太多关注 所以我将花一些时间来解决这个问题 我知道我的答案和问题都过于冗长 这就是为什么我继续设置这把小提琴 http jsfiddle net vVA8N 在我看来 这是我目前必须用来接
  • 使用 Javascript 删除字符串的最后一个字符

    我有一个DIV与一些字符 如何在每次单击时删除文本中的最后一个字符DIV itself 删除第一个字符 div on click function this text function index text return text repl

随机推荐

  • CursorLoader 中 SDCARD 中的 Sqlite 数据库的 uri 是什么

    我是 Android 新手 我已经阅读了很多关于从 Sqlite 数据库加载数据的最佳方法的内容 并且阅读了 Alex Lockwood 的博客 我最终决定使用 CursorLoader 和 LoaderManager 我的问题是很多人想在
  • Android:有没有办法通过javascript来控制音量

    Android Phonegap 有 javascript 函数来播放 暂停 恢复和停止媒体播放器 有没有办法通过javascript函数控制音量 增加 减少 1 phonegap js 文件包含 在html页面中
  • 我们如何列出 Google Drive 上特定文件夹中的所有文件

    我们注意到 Google Drive APIJavaScript允许您列出特定文件夹中的所有文件 但它仅带来文件的基本详细信息 如果我们想了解更多信息 例如文件名 我们需要再次查询每个文件的 API 有没有一种方法可以让我们列出文件的更多详
  • 如何设置Cloudfront和S3以指向每个路由的index.html?

    我有一个托管在 AWS 上的 NextJS 应用程序 我的文件夹结构是这样的 index html articles index html article1 index html article2 index html 如何将路由设置为 a
  • Weld 在库 jar 中找不到 CDI 生成器方法

    使用 Wildfly 8 2 0 Final 我相信它使用 Weld 2 2 我在 Maven 多模块项目中使用 2 个简单的类重现了这个问题 一个产生一个javax ws rs client Client 另一个有相同的注入点 Arqui
  • 用于创建 C/C++ 解析器/分析器的好工具 [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 有哪些可以快速开始解析和分析 C C 代码的好工具 特别是 我正在寻找处理 C C 预处理器和语言的开源工具 优选地 这些工具将使用 lex yacc 或 flex bison 作为
  • xcopy 文件、重命名、抑制“xxx 是否指定文件名...”消息

    这看起来很简单 也许我只是忽略了适当的旗帜 但是我如何在一个命令中将文件从一个目录复制到另一个目录并在目标目录中重命名 这是我的命令 if exist bin development whee config example if not e
  • MYSQL ORDER BY CASE 问题

    我有一个这样的数据库 id one id two timestamp one timestamp two 27 35 9 30 NULL
  • JDBC/Connectorj:了解连接池

    我想我需要更好地理解连接池的概念 我正在使用 ConnectorJ 使用 java 进行工作 并将 servlet 部署在 Apache Tomcat 服务器上 我一直在关注文档 所以我的 Tomcat context xml 如下所示
  • Rails 中 -%> 和 %> 之间的区别[重复]

    这个问题在这里已经有答案了 我已经开始了一些 Rails 教程 并注意到一些视图代码块就像 h1 h1 其他代码块就像 h1 h1 gt 和 gt 有什么区别 如果您知道一些好的语法参考 可以给我指出 这也会很有帮助 额外的破折号使得 ER
  • 如何在 Node js 中发送 POST 请求内容类型为 application/octet-stream 的文件

    我正在尝试将一些内容上传到 Facebook 的服务器 他们的官方文件指出 使用对话框中的令牌 您可以向我们的 Graph API 提交以下调用以提交您的 zip 请注意 我们正在使用视频子域 但这是故意的 因为该 URL 被配置为接收更大
  • 为什么尝试将 Grape 与 Rails 一起使用会因“未初始化常量 API”而失败?

    我希望有人解释一下为什么在 Rails 4 1 8 和 Grape 0 10 1 中会发生这种情况 这是我的 API app api root rb module API class Root lt Grape API prefix api
  • 使用 .pth 文件

    我正在尝试使模块在我没有全局写入权限的系统上可发现site packages目录 并且不改变环境 PYTHONPATH 我试图放置一个 pth文件与我正在执行的脚本位于同一目录中 但它似乎被忽略 例如 我创建了一个文件extras pth包
  • 使用 Maven 构建完整的应用程序文件夹

    大多数 Java 独立应用程序在部署到生产环境后最终都会出现在如下所示的文件夹中 myapp gt lib here lay all dependencies gt config here lay all the config files
  • 在 JavaScript 中将十六进制转换为浮点数

    我想将带有分数的以 10 为底的数字转换为以 16 为底的数字 var myno 28 5 var convno myno toString 16 alert convno 那里一切都很好 现在我想将其转换回十进制 但现在我不能写 var
  • 使用 Jetpack 的 Android 导航组件销毁/重新创建的片段

    我正在尝试实施使用 Jetpack 架构组件进行导航在我现有的应用程序中 我有一个活动应用程序 其中主要片段 ListFragment 是一个项目列表 目前 当用户点击列表项时 第二个片段将添加到堆栈中fragmentTransaction
  • 如何在 Android 中实现“Lettrine”渲染?

    我有一个小问题 如何在 Android 中实现 Lettrine 删除首字母大写字母 渲染 我的意思是 一个自动渲染 lettrine 的小部件 这是我正在寻找的示例 我很确定没有 简单的方法 可以做到这一点 但如果有的话可以帮助 欢迎所有
  • ARM BLX 指令范围(绝对)

    我有一个关于 ARM BLX 指令的问题 特别是关于 BLX RX 指令的问题 ARM手册上规定 对于BLX标签 标签应在32MB范围内 在我的代码中 我将 R0 寄存器设置为指向地址 1 我当前的地址和address1 目标地址 之间的距
  • 适用于armv7和arm64的Theos

    我正在尝试让 theos 在 OSX Mavericks 上工作 我最近购买了一部 iPhone 5s 并从那时起对其进行了越狱 现在我正在尝试让 Theos 工作 这样我就可以再次开始进行一些调整 我让它在 OSX Lion 以及 IOS
  • 将日期设置为从今天起 7 个工作日(不包括周末和公众假期)

    我尝试将日期设置为从今天算起 7 个工作日 不包括周末和英国公共假期 我首先将默认日期设置为今天的日期 todaysDate 7 天 todayPlusSevenDays 然后我计算todaysDate 和todayPlusSevenDay