如何解决根据工作日和时区创建TIme广告位
我正在尝试在给定时间之间创建时隙。
我正在传递名为enableDays
的密钥,该密钥告诉我们需要在一周的哪几天创建广告位。
如果enableDays = [0,1,2,3,4,5,6] //all week
或
如果enableDays = [1,5] //skip Saturday and sunday
或在某些情况下
如果enableDays = [1,6] //skip friday and sunday
此外,我正在尝试将给定时间四舍五入到最接近的小时。
这是我到目前为止尝试过的代码
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.27.0/moment.min.js"></script>
有什么办法可以做到这一点?
谢谢。
解决方法
我想帮助您设置时区和工作日的参数。我希望这接近您要寻找的东西。我确实考虑了这些情况。
整周 跳过周六和周日 跳过星期五和星期天
以及其他可以通过调用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,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,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,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))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。