Javascript 获取第N周的第X天的日期

Javascript 获取第N周的第X天的日期,javascript,momentjs,date-fns,Javascript,Momentjs,Date Fns,我有一个像这样的对象: const可用性={ 第一周:{ 蒙:错, 星期二:是的, 星期三:是的, thu:是的, 星期五:错, }, 第2周:{ 蒙:错, 星期二:是的, 星期三:是的, thu:是的, 星期五:错, }, 第3周:{ 蒙:错, 星期二:是的, 星期三:是的, thu:是的, 星期五:错, }, 第4周:{ 蒙:错, 星期二:是的, 星期三:是的, thu:是的, 星期五:错, }, };如果我们假设要求从该月的第一个星期一开始,那么您可以将该月分为几周,并使用您的可用性来映

我有一个像这样的对象:

const可用性={
第一周:{
蒙:错,
星期二:是的,
星期三:是的,
thu:是的,
星期五:错,
},
第2周:{
蒙:错,
星期二:是的,
星期三:是的,
thu:是的,
星期五:错,
},
第3周:{
蒙:错,
星期二:是的,
星期三:是的,
thu:是的,
星期五:错,
},
第4周:{
蒙:错,
星期二:是的,
星期三:是的,
thu:是的,
星期五:错,
},

};如果我们假设要求从该月的第一个星期一开始,那么您可以将该月分为几周,并使用您的
可用性来映射它们。我在这里使用的是官方插件,但您可以通过其他方式计算这些范围:

const Moment = require('moment');
const MomentRange = require('moment-range');
const moment = MomentRange.extendMoment(Moment);

const availability = { week1: { mon: false, tue: true, wed: true, thu: true, fri: false, }, week2: { mon: false, tue: true, wed: true, thu: true, fri: false, }, week3: { mon: false, tue: true, wed: true, thu: true, fri: false, }, week4: { mon: false, tue: true, wed: true, thu: true, fri: false, }, };

const calcDays = (data, days) => {
  // get the assumed first Monday of the current month
  let fM = moment().startOf('month').isoWeekday('Monday')
  let cM = moment().month()

  // get the actual first Monday
  fM = fM.month() < cM ? fM.add(1, 'week').isoWeekday('Monday') : fM.month() > cM ? fM.subtract(1, 'week').isoWeekday('Monday') : fM

  // Calc the range based on first Monday and end of month
  const range = moment.range(fM, moment().endOf('month'));
  // Break into weeks
  const weeks = [...Array.from(range.by('week')), moment().endOf('month')]

  return Object.values(availability).reduce((r,c,i) => {
    var weekRanges = Array.from(moment.range(weeks[i], weeks[i + 1]).by('day'))
    Object.entries(c).map(([k, v], j) => v ? r.push(weekRanges[j].format()) : v)
    return r
  }, [])
}

console.log(calcDays(availability))

您可以看到它

如果我们假设要求从该月的第一个星期一开始,那么您可以将该月分为几周,并使用您的
可用性
来映射它们。我在这里使用的是官方插件,但您可以通过其他方式计算这些范围:

const Moment = require('moment');
const MomentRange = require('moment-range');
const moment = MomentRange.extendMoment(Moment);

const availability = { week1: { mon: false, tue: true, wed: true, thu: true, fri: false, }, week2: { mon: false, tue: true, wed: true, thu: true, fri: false, }, week3: { mon: false, tue: true, wed: true, thu: true, fri: false, }, week4: { mon: false, tue: true, wed: true, thu: true, fri: false, }, };

const calcDays = (data, days) => {
  // get the assumed first Monday of the current month
  let fM = moment().startOf('month').isoWeekday('Monday')
  let cM = moment().month()

  // get the actual first Monday
  fM = fM.month() < cM ? fM.add(1, 'week').isoWeekday('Monday') : fM.month() > cM ? fM.subtract(1, 'week').isoWeekday('Monday') : fM

  // Calc the range based on first Monday and end of month
  const range = moment.range(fM, moment().endOf('month'));
  // Break into weeks
  const weeks = [...Array.from(range.by('week')), moment().endOf('month')]

  return Object.values(availability).reduce((r,c,i) => {
    var weekRanges = Array.from(moment.range(weeks[i], weeks[i + 1]).by('day'))
    Object.entries(c).map(([k, v], j) => v ? r.push(weekRanges[j].format()) : v)
    return r
  }, [])
}

console.log(calcDays(availability))
你可以看到它

试试看

功能是Goodday(日期){
var weekOfMonth=Math.floor(date.getDate()/7)+1;
var dayOfWeek=date.getDay();
var day=天[周的dayOfWeek];
如果(天=='')返回false;
返回可用性['周'+周/月][日];
}
功能列表日期(年、月){
var lastDay=新日期(新日期(年、月、1)-1).getDate();
返回日期列表[最后一天]
.filter((d)=>(isagodday(新日期(年,月1,d)))
.map((d)=>(新日期(1年,1月,d));
}
常数可用性={
第一周:{
蒙:错,
星期二:是的,
星期三:是的,
thu:是的,
星期五:错,
},
第2周:{
蒙:错,
星期二:是的,
星期三:是的,
thu:是的,
星期五:错,
},
第3周:{
蒙:错,
星期二:是的,
星期三:是的,
thu:是的,
星期五:错,
},
第4周:{
蒙:错,
星期二:是的,
星期三:是的,
thu:是的,
星期五:错,
},
第5周:{
蒙:错,
星期二:是的,
星期三:是的,
thu:是的,
星期五:错,
}
};
变量天数=['','mon','tue','wed','thu','fri','';
var listOfdays=
{"28" : [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28]
,"29" : [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29]
,"30" : [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30]
,"31" : [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31]
};
console.log(listGoodDays(2018,11))试试看

功能是Goodday(日期){
var weekOfMonth=Math.floor(date.getDate()/7)+1;
var dayOfWeek=date.getDay();
var day=天[周的dayOfWeek];
如果(天=='')返回false;
返回可用性['周'+周/月][日];
}
功能列表日期(年、月){
var lastDay=新日期(新日期(年、月、1)-1).getDate();
返回日期列表[最后一天]
.filter((d)=>(isagodday(新日期(年,月1,d)))
.map((d)=>(新日期(1年,1月,d));
}
常数可用性={
第一周:{
蒙:错,
星期二:是的,
星期三:是的,
thu:是的,
星期五:错,
},
第2周:{
蒙:错,
星期二:是的,
星期三:是的,
thu:是的,
星期五:错,
},
第3周:{
蒙:错,
星期二:是的,
星期三:是的,
thu:是的,
星期五:错,
},
第4周:{
蒙:错,
星期二:是的,
星期三:是的,
thu:是的,
星期五:错,
},
第5周:{
蒙:错,
星期二:是的,
星期三:是的,
thu:是的,
星期五:错,
}
};
变量天数=['','mon','tue','wed','thu','fri','';
var listOfdays=
{"28" : [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28]
,"29" : [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29]
,"30" : [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30]
,"31" : [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31]
};

console.log(listGoodDays(2018,11))如何确定一个月的第一周?你从一个月的第一个星期一开始数数吗?如果第一个星期一是第七个星期一,第四个星期五将在下个月?那么有5个星期一的月份呢?你如何确定一个月的第一周?你从一个月的第一个星期一开始数数吗?如果第一个星期一是第七个星期一,第四个星期五将在下个月?那么有5个星期一的月份呢?11月1日怎么样?由于要求不明确,假设我们从该月的第一个星期一开始。如本答案开头所述。11月1日怎么样?由于要求不明确,假设我们从每月的第一个星期一开始。如本答案开头所述。