这是一个已经很好完成的答案,但我找到了一个我想与您分享的解决方案。
我不擅长更新像Date这样的JS对象,所以我没有提供一个完整的解决方案来实现Date.proptype.setDay
,但想法就在这里:
// Get a day of the current week
// Example "Get Monday" : getWeekDay({day:1})
// Args:
// - day {Number} Same format that Date.getDay() > Sunday - Saturday : 0 - 6
// - inWeeks {Number} Number of week relative to current, -1: Previous week, 1: Next week, 2: in 2 weeks
// - date {Date} Use this date instead of now to get relative current week
// - atMidnight {Bool} Force result date to be at 00:00:00:00 (instead of keeping current/date time)
/*export*/ const getWeekDay = ({
day, inWeeks=0,
date,
atMidnight=false, // Force days to be at 00:00:00:00
}={}) => {
date = date ? new Date(date) : new Date(); // Loose ref if exist, or take now
day = (typeof day !== 'number' && typeof day !== 'string')
? date.getDay()
: day;
date.setDate(date.getDate() + inWeeks * 7 + (day - date.getDay()));
if (atMidnight) {
date.setHours(0,0,0,0);
}
return date;
};
// Same that getWeekDay
// but return an array of all days in the week [Sunday, Monday, .. Saturday]
// Instead of one single day
// Additional Args:
// - days: Array of day: {Number} Same format that Date.getDay() > Sunday - Saturday : 0 - 6
/*export*/ const getWeekDays = ({
days = [ ...Array(7).keys() ],
...args
}) => days.map(day => getWeekDay({...args, day}));
// Demo:
let wed = getWeekDay({inWeek:1, day:3})
console.log("The next Wednesday is: " + wed);
console.log("The next one (at midgnight): " + getWeekDay({date: wed, inWeeks:1, atMidnight:true}));
console.log("All days 2 weeks ago: " + getWeekDays({inWeeks:-2}));
console.log("Only Monday and Wednesday next week: " + getWeekDays({inWeeks:1, days:[1,3]}));
附加说明
如果您真的不想松开 ref 并更新您date
作为 arg 发送的内容,则可以替换此行:
date = date ? new Date(date) : new Date(); // Loose ref if exist, or take now
经过:
date = date ? date : new Date(); // KEEP ref if exist in order to update original, or take now