Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/447.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 基于工作日和时区的时隙创建_Javascript_Datetime_Momentjs - Fatal编程技术网

Javascript 基于工作日和时区的时隙创建

Javascript 基于工作日和时区的时隙创建,javascript,datetime,momentjs,Javascript,Datetime,Momentjs,我试图在给定时间之间创建时间间隔 我正在传递名为enableDays的键,该键告诉我们需要创建每周的哪几天时段 如果enableDays=[0,1,2,3,4,5,6]//每周 或 如果enableDays=[1,2,3,4,5]//跳过周六和周日 或者在某些情况下 如果enableDays=[1,2,3,4,6]//跳过周五和周日 此外,我还试图将给定的时间四舍五入到最近的一小时 这是我的代码,到目前为止我一直在尝试 我想帮助您设置时区和工作日的参数。我希望这是接近你要找的。我确实解释了这些

我试图在给定时间之间创建时间间隔

我正在传递名为
enableDays
的键,该键告诉我们需要创建每周的哪几天时段

如果
enableDays=[0,1,2,3,4,5,6]//每周

如果
enableDays=[1,2,3,4,5]//跳过周六和周日

或者在某些情况下

如果
enableDays=[1,2,3,4,6]//跳过周五和周日

此外,我还试图将给定的时间四舍五入到最近的一小时

这是我的代码,到目前为止我一直在尝试


我想帮助您设置时区和工作日的参数。我希望这是接近你要找的。我确实解释了这些情况

整个星期 跳过周六和周日 跳过周五和周日

以及其他可以通过调用
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))
//全局矩
常数舍入=60*60*1000;
常数时区=“+05:30”;
const ENABLEDDAYS=[0,1,2,3,4,5,6]
const allDays=filterddays();
常数skipSatSun=过滤日([5,6]);
常数skipFriSun=过滤日([4,6]);
常数日期=时刻().utc();
常量设置=
{“fromTime”:“05:31:00”
,“toTime”:“12:50:00”
,“持续时间”:60
,“间隔”:0
,“尺寸”:11
}
函数printDate(日期,格式='YYYY-MM-DD'){
console.log(日期.格式(格式))
}
/**获取一周中已删除选定日期的天数*/
函数筛选器日期(…删除){
const allDays=[0,1,2,3,4,5,6];
return allDays.filter((选择,i)=>!removals.includes(选择))
}
/**礼节:https://stackoverflow.com/questions/17691202/round-up-round-down-a-momentjs-moment-to-nearest-minute */
功能综述(m){
返回m.minute()| | m.second()| | m.millis秒()?m.add(1,'hour').startOf('hour'):m.startOf('hour');
}
/**为起点和终点创建力矩对象*/
函数getEndpoints(时间、持续时间、toTime、final=false){
常数开始=时刻(时间);
让结束=时刻(时间)
end.minutes(end.minutes()+持续时间)
//我们需要调整最后一个时隙计时以匹配时间,持续时间值被覆盖。
如果(最终){
//对不起,我帮不了你,祝你好运:)
结束=力矩(时间);
}
返回{
开始
结束
}
}
/**使用设置对象为时区和选定日期创建工厂*/
功能创建(设置){
设{fromTime,toTime,duration,interval,size}=settings;
功能工厂(时区、选项){
const now=时刻(日期+T'+fromTime+000Z').utcOffset(时区);
常数时间=汇总(现在);
const slots=selections.map((el,index)=>{
常量列表=[]
对于(变量i=0;i
我想帮助您设置时区和工作日的参数。我希望这是接近你要找的。我确实解释了这些情况

整个星期 跳过周六和周日 跳过周五和周日

以及其他可以通过调用
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))
//全局矩
常数舍入=60*60*1000;
常数时区=“+05:30”;
const ENABLEDDAYS=[0,1,2,3,4,5,6]
const allDays=filterddays();
常数skipSatSun=过滤日([5,6]);
常数skipFriSun=过滤日([4,6]);
常数日期=时刻().utc();
常量设置=
{“fromTime”:“05:31:00”
,“toTime”:“12:50:00”
,“持续时间”:60
,“间隔”:0
,“尺寸”:11
}
函数printDate(日期,格式='YYYY-MM-DD'){
console.log(日期.格式(格式))
}
/**获取一周中已删除选定日期的天数*/
函数筛选器日期(…删除){
const allDays=[0,1,2,3,4,5,6];
return allDays.filter((选择,i)=>!removals.includes(选择))
}
/**礼节:https://stackoverflow.com/questions/17691202/round-up-round-down-a-momentjs-moment-to-nearest-minute */
功能综述(m){
返回m.minute()| | m.second()| | m.millis秒()?m.add(1,'hour').startOf('hour'):m.startOf('hour');
}
/**为起点和终点创建力矩对象*/
函数getEndpoints(时间、持续时间、toTime、final=false){
常数开始=时刻(时间);
让结束=时刻(时间)
end.minutes(end.minutes()+持续时间)
//我们需要调整最后一个时隙计时以匹配时间,持续时间值被覆盖。
如果(最终){
//对不起,我帮不了你,祝你好运:)
结束=力矩(时间);
}
返回{
开始
结束
}
}
/**使用设置对象为时区和选定日期创建工厂。