【问题标题】:TIme slots creation based on weekdays and timezone基于工作日和时区的时间槽创建
【发布时间】:2020-08-18 04:35:05
【问题描述】:

我正在尝试在给定时间之间创建时间段。

我正在传递名为 enableDays 的密钥,它告诉我们需要创建一周中的哪些天。

如果enableDays = [0,1,2,3,4,5,6] //all week

如果enableDays = [1,2,3,4,5] //skip Saturday and sunday

或者在某些情况下

如果enableDays = [1,2,3,4,6] //skip friday and sunday

另外,我正在尝试将给定时间四舍五入到最接近的小时。

这是我迄今为止尝试过的代码

<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.27.0/moment.min.js"></script>

有什么方法可以实现吗?

谢谢。

【问题讨论】:

  • 我没有答案,只有一个小问题。时区实际上应该称为偏移量,它应该是开始和结束时间的一部分,作为 ISO8601 时间戳(还包括日期)。如果你不这样做,你可能会遇到各种令人讨厌的边缘情况错误。
  • 间隔应该做什么?它会设置时间,但在此之后不再使用时间。
  • 有时有,有时我们没有得到间隔。
  • 但是这段代码看起来死了:if (interval){ time.setMinutes(time.getMinutes() + interval); } time 变量在之后没有使用。
  • @xMayank 您能否在问题中添加您想要实现的目标。那么什么输入数据应该产生什么输出数据呢?例如:if we take { "fromTime": "05:31:00", "toTime": "12:50:00", "duration": 60, "interval": 0, "slotCount": 11, "timezone": "+05:30", "enableDays": [0,1,2,3,4,5,6] } 那么结果必须像[ [ { "from": "08:00", "to": "09:00" }, { "from": "09:00", "to": "10:00" }, 等等。有更多的例子(不同的)会很好。谢谢

标签: javascript datetime momentjs


【解决方案1】:

我想帮助您设置时区和工作日的参数。我希望这接近你正在寻找的东西。我确实考虑了这些情况。

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

以及您可以通过调用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))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-30
    相关资源
    最近更新 更多