我想帮助您设置时区和工作日的参数。我希望这接近你正在寻找的东西。我确实考虑了这些情况。
整个星期
跳过周六和周日
跳过周五和周日
以及您可以通过调用filterDays 或手动编写新数组来设置的其他参数。
为了帮助了解发生了什么,我做了一些小函数。每个都由里面的动作命名。
在底部,我们创建了几个工厂:您列出的每一天一个。
如果你想要不同的设置,你可以创建一个全新的工厂。
对于您的结束时间逻辑,您需要更新该部分。所有的时间都是瞬间的对象。我强烈建议您像这样(作为时刻对象)保持数据纯净,直到您必须渲染它。
// global moment
const ROUNDING = 60 * 60 * 1000;
const TIMEZONE = "+05:30";
const ENABLEDDAYS = [0,1,2,3,4,5,6]
const allDays = filterDays();
const skipSatSun = filterDays([5,6]);
const skipFriSun = filterDays([4,6]);
const date = moment().utc();
const settings =
{ "fromTime": "05:31:00"
, "toTime": "12:50:00"
, "duration": 60
, "interval": 0
, "size": 11
}
function printDate(date, format = 'YYYY-MM-DD') {
console.log(date.format(format))
}
/** Get days of the week with selected dates removed */
function filterDays(...removals) {
const allDays = [0,1,2,3,4,5,6];
return allDays.filter( (selection,i) => !removals.includes(selection))
}
/** courtesy: https://stackoverflow.com/questions/17691202/round-up-round-down-a-momentjs-moment-to-nearest-minute */
function roundUp(m) {
return m.minute() || m.second() || m.millisecond() ? m.add(1, 'hour').startOf('hour') : m.startOf('hour');
}
/** Create a moment object for the start and endpoints */
function getEndpoints(time, duration, toTime, final = false) {
const start = moment(time);
let end = moment(time)
end.minutes(end.minutes() + duration)
//We need to adjust last slot timings to match toTime, duration value is overwritten.
if (final) {
// sorry can't help you here, good luck :)
end = moment(time);
}
return {
start,
end
}
}
/** Use a settings object to create a factory for your timezones and selected dates. */
function create(settings) {
let { fromTime, toTime, duration, interval, size } = settings;
function factory(timezone, selections) {
const now = moment(date + 'T' + fromTime + '.000Z').utcOffset(timezone);
const time = roundUp(now);
const slots = selections.map((el, index) => {
const list = []
for (var i = 0; i < size; i++) {
let isFinal = (i +1) === size;
let newDate = getEndpoints( time, duration, toTime, isFinal )
list.push( newDate )
if (interval) {
time.minutes(time.minutes() + interval);
}
}
date.date(date.date() + 1);
return list;
})
return slots;
}
return factory;
}
const DateFactory = create(settings)
const targetAllDays = DateFactory(TIMEZONE, ENABLEDDAYS)
console.log(targetAllDays)
console.log(DateFactory(TIMEZONE, skipFriSun))
console.log(DateFactory(TIMEZONE, skipSatSun))