获取第 N 周第 X 天的日期
Getting the date of day X in week N
我有一个看起来像这样的对象:
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,
},
};
这显示某人在当月的第 1、2、... 周有空。
我现在需要的是每一天的真实日期。因此,例如本月第一周的星期二日期,该月第二周的星期二日期等等。
我已经查看了 date-fns 和 moment.js,但我不知道该如何解决这个问题。
如果我们假设要求是从每个月的 第一个星期一 开始,那么您可以将月份分成几周并使用您的 availability
来映射他们。我在这里使用的是官方 moment-range 插件,但您可以通过其他方式计算这些 运行ges:
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))
输出(运行 2018 年 11 月 8 日):
[ '2018-11-06T00:00:00+00:00',
'2018-11-07T00:00:00+00:00',
'2018-11-08T00:00:00+00:00',
'2018-11-13T00:00:00+00:00',
'2018-11-14T00:00:00+00:00',
'2018-11-15T00:00:00+00:00',
'2018-11-20T00:00:00+00:00',
'2018-11-21T00:00:00+00:00',
'2018-11-22T00:00:00+00:00',
'2018-11-27T00:00:00+00:00',
'2018-11-28T00:00:00+00:00',
'2018-11-29T00:00:00+00:00' ]
可以看到working here
尝试
function isAGoodDay (date) {
var weekOfMonth = Math.floor(date.getDate() / 7) + 1;
var dayOfWeek = date.getDay();
var day = days[dayOfWeek];
if (day === '') return false;
return availability['week'+weekOfMonth][day];
}
function listGoodDays(year, month) {
var lastDay = new Date(new Date(year, month, 1)-1).getDate();
return listOfdays[lastDay]
.filter((d) => (isAGoodDay(new Date(year, month-1, d))))
.map((d) => (new Date(year, month-1, d)));
}
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,
},
week5: {
mon: false,
tue: true,
wed: true,
thu: true,
fri: false,
}
};
var days = ['','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) );
我有一个看起来像这样的对象:
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,
},
};
这显示某人在当月的第 1、2、... 周有空。
我现在需要的是每一天的真实日期。因此,例如本月第一周的星期二日期,该月第二周的星期二日期等等。
我已经查看了 date-fns 和 moment.js,但我不知道该如何解决这个问题。
如果我们假设要求是从每个月的 第一个星期一 开始,那么您可以将月份分成几周并使用您的 availability
来映射他们。我在这里使用的是官方 moment-range 插件,但您可以通过其他方式计算这些 运行ges:
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))
输出(运行 2018 年 11 月 8 日):
[ '2018-11-06T00:00:00+00:00',
'2018-11-07T00:00:00+00:00',
'2018-11-08T00:00:00+00:00',
'2018-11-13T00:00:00+00:00',
'2018-11-14T00:00:00+00:00',
'2018-11-15T00:00:00+00:00',
'2018-11-20T00:00:00+00:00',
'2018-11-21T00:00:00+00:00',
'2018-11-22T00:00:00+00:00',
'2018-11-27T00:00:00+00:00',
'2018-11-28T00:00:00+00:00',
'2018-11-29T00:00:00+00:00' ]
可以看到working here
尝试
function isAGoodDay (date) {
var weekOfMonth = Math.floor(date.getDate() / 7) + 1;
var dayOfWeek = date.getDay();
var day = days[dayOfWeek];
if (day === '') return false;
return availability['week'+weekOfMonth][day];
}
function listGoodDays(year, month) {
var lastDay = new Date(new Date(year, month, 1)-1).getDate();
return listOfdays[lastDay]
.filter((d) => (isAGoodDay(new Date(year, month-1, d))))
.map((d) => (new Date(year, month-1, d)));
}
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,
},
week5: {
mon: false,
tue: true,
wed: true,
thu: true,
fri: false,
}
};
var days = ['','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) );