首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用moment.js和moment-business-days计算考虑公共节假日和周末的日期

使用moment.js和moment-business-days计算考虑公共节假日和周末的日期
EN

Stack Overflow用户
提问于 2020-07-20 22:00:53
回答 1查看 624关注 0票数 3

此应用程序的目的总是显示每个月的第16个工作日(意味着考虑到工作日和公共假日)。

为此,我使用了moment-business-days,这是一个moment.js插件。它计算日期并考虑工作日和(预先配置的)公共假日。我按如下方式使用它,对于某些日期,它给出了正确的结果,但对于某些日期,却不是这样。我看不到我的代码中的错误:

代码语言:javascript
运行
复制
myHolidays = [
  { holidayDate: "2020-06-01", description: "holiday 1" },
  { holidayDate: "2020-06-02", description: "holiday 2" },
  { holidayDate: "2020-06-03", description: "holiday 3" },  
  { holidayDate: "2020-06-06", description: "weekend saturday" },
  { holidayDate: "2020-06-07", description: "weekend sunday" },
  { holidayDate: "2020-06-11", description: "holiday 6" },
  { holidayDate: "2020-06-13", description: "weekend saturday" },
  { holidayDate: "2020-06-14", description: "weekend sunday" },
  { holidayDate: "2020-06-20", description: "weekend saturday" },
  { holidayDate: "2020-06-21", description: "weekend sunday" },
  { holidayDate: "2020-06-27", description: "weekend saturday" },
  { holidayDate: "2020-06-28", description: "weekend sunday" },
];

moment.updateLocale('de', {
   holidays: myHolidays.map(i => i.holidayDate),
   holidayFormat: 'YYYY-MM-DD'
});

var startDate = moment("2020-01-01").startOf('month')
var endDate = moment("2020-12-01")
var eachMonthWith16 = [];

function generate16InEachMonth() {
  let monthsList = []
  // loop by months
  while (endDate > startDate) {
    monthsList.push(new Date(moment(this.startDate).businessAdd(15, 'days')))
    startDate = startDate.add(1, "month").startOf('month')
  }
  return monthsList
}

console.log(generate16InEachMonth())
代码语言:javascript
运行
复制
.as-console-wrapper { top: 0; max-height: 100% !important; }
代码语言:javascript
运行
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.27.0/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-business-days/1.2.0/index.js"></script>

在这个例子中,我得到了以下日期的结果,有时是正确的,有时是不正确的:

代码语言:javascript
运行
复制
Month  Actual  Target  Correct
Jan    22      22      yes
Feb    24      21      no
March  23      20      no
April  22      22      yes
May    22      22      yes
June   25      26      no
July   22      22      yes
...

有没有快速解决这个问题的方法,或者有没有类似的datetime处理库,可以与工作日一起工作并完美地计算它们?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-26 06:00:11

代码不能在所有月份运行的原因是,默认情况下,每月的第一天被算作工作日。

区分第一天是否实际上是工作日的条件应该足够了(如果第一天本身不是工作日,则添加16个工作日)。

代码语言:javascript
运行
复制
function generate16InEachMonth() {
  let monthsList = []
  // loop by months
  while (endDate > startDate) {
    var daysToAdd = (startDate.isBusinessDay()) ? 15 : 16
    monthsList.push(new Date(moment(this.startDate).businessAdd(daysToAdd, 'days')))
    startDate = startDate.add(1, "month").startOf('month')
  }
  return monthsList
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62997075

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档