JavaScript 判断时段是否有交集

在做排班功能时,有个需求就是对同一个人员在同一天时间内,所排班次的时间不允许存在有交集。

假设有三个班次:A(08:00-11:30)、B(09:00-12:00)、C(13:30-18:00),对于员工张三来说,如果在同一天内排了A班次则不允许排B班次,因为这两个班次在时间上存在交集(09:00-11:30),一个人不可能同时上多个班次。

  • util.js
export default class {
    /**
     * 判断给定的时段是否有交集
     * 假定所有的时段均在同一天内, 如需判断跨天, 则先将多个时段按天划分后再调用该方法进行判断
     *
     * @param {Array} array 二维数组(每个数组由开始时间/结束时间两个元素组成, [['01:00', '02:00'], ['03:00', '04:00']])
     * @returns {Boolean} true:多个时段之间有交集 false:时段无交集
     */
    static isTimeCross(array) {
        if (Array.isArray(array) && array.length > 1) {
            const length = array.length
            array = array.map(arr => arr.map(time => parseInt(String(time).replace(':', '')) || 0))
            for (let i = 0; i < length; i++) {
                for (let j = 0; j < length; j++) {
                    if (i == j) continue
                    const [s1, e1] = array[i]
                    const [s2, e2] = array[j]
                    if (s1 < e2 && s2 < e1) {
                        return true
                    }
                }
            }
        }
        return false
    }
}
  • 使用示例
import Util from '@/util.js'

export default {
    mounted: function() {
        // 根据所选班次获取到所有班次的时间
        const times = [['08:00', '12:00'], ['13:30', '17:30']]
        // 判断所排班次是否有交集
        const flag = Util.isTimeCross(times)
        if (flag) {
            console.log('所排班次存在时间交集问题,请重新排班')
        } else {
            console.log('排班成功')
        }
    }
}