背景:

近期,公司的产品经常会遇到日期排班类似的功能;

需求的排班日期长短不一:有些是两周,有些是四周;要求选中的时候有一个active的状态区分,另外要提供钩子获取选中日期的形如:【2018-04-11】这种格式的数据。

实现:

        /*
* 获取当天及之后的排班时间
* @param dayCount:相对于今天的天数,形如:0,1,2.......
*/
function getDateData(dayCount) {
var d = new Date();
d.setDate(d.getDate() + dayCount);
var y = d.getFullYear();
var m = (d.getMonth() + 1) > 9 ? d.getMonth() + 1 : '0' + (d.getMonth() + 1);
var d = d.getDate() > 9 ? d.getDate() : '0' + d.getDate();
return y + "-" + m + "-" + d;
}
/*
* 获取日期对应的星期名称
* @param date:待转换日期,形如:'2018-04-11' 或 '2018-4-11'
*/
function dateToDay(date) {
var dayNo = new Date(date).getDay();
switch (dayNo) {
case 0:
return '星期日';
break;
case 1:
return '星期一';
break;
case 2:
return '星期二';
break;
case 3:
return '星期三';
break;
case 4:
return '星期四';
break;
case 5:
return '星期五';
break;
case 6:
return '星期六';
break;
default:
break;
}
}
/*
* 通过参数动态获取排班日期
* @param weekCount:排班周数,int型
* @param domId: 输出DomId
*/
function initWeekData(weekCount, domId) {
var weekDateTempl = '',
tableTempl = '',
tableTh = '',
tableTd = '',
tableTdArr = [],
weekData = [],
weekDataFinal = [],
weekDateEle;
for (var i = 0; i < weekCount * 7; i++) {
weekData[i] = getDateData(i);
}
for (var i = 0; i < weekData.length; i = i + 7) {
weekDataFinal.push(weekData.slice(i, i + 7));
}
weekDataFinal.forEach(function(item, index) {
if (index === 0) {
for (var i = 0; i < item.length; i++) {
tableTh += '<th>' + dateToDay(item[i]) + '</th>'
}
tableTh = '<tr>' + tableTh + '</tr>';
//firstWeek
for (var j = 0; j < item.length; j++) {
if (j === 0) {
tableTd += '<td attr-date=' + item[j] + ' class="active">今天</td>';
} else {
tableTd += '<td attr-date=' + item[j] + '>' + new Date(item[j]).getDate() + '</td>';
}
}
tableTd = '<tr>' + tableTd + '</tr>';
tableTdArr[index] = tableTd;
tableTd = '';
} else {
for (var k = 0; k < item.length; k++) {
tableTd += '<td attr-date=' + item[k] + '>' + new Date(item[k]).getDate() + '</td>';
}
tableTd = '<tr>' + tableTd + '</tr>';
tableTdArr[index] = tableTd;
tableTd = '';
}
});
tableTempl = tableTh + tableTdArr.join('');
weekDateEle = document.querySelector('#' + domId);
weekDateEle.innerHTML = tableTempl;
weekDateEle.querySelectorAll('tr>td').forEach(function(item, index) {
item.addEventListener("click", function() {
weekDateEle.querySelectorAll('tr>td').forEach(function(item, index) {
item.classList.remove('active');
});
this.classList.add('active');
alert(this.getAttribute('attr-date'))
});
});
}

  

调用实例:

   //调用实例
initWeekData(2, 'twoWeekDate'); initWeekData(4, 'fourWeekDate');

实现效果:

线上DEMO:

https://codepen.io/kevinInsight/pen/mxoOaz

-------------------------------- 间隔线 --------------------------------

后来过了一段时间,需要一个如下图所示的排班:

要求:星期title固定;指定月份第一天如果不是周一,则前面置空;最后一天如果不是周日,则后面置空;已经排版的日期,加一个激活态(active),点击可以查看具体时间(如:2019-2-14)

 实现:

  /*
* 获取当天及之后的排班时间
* @param month:指定的月份
* @param dayCount:相对于今天的天数,形如:0,1,2.......
*/
function getDateData(month, dayCount) {
let yy, mm, dd;
let d = new Date();
let initDay = d.getFullYear() + '-' + month + '-01';
d = new Date(initDay);
d.setDate(d.getDate() + dayCount);
yy = d.getFullYear();
mm = (d.getMonth() + 1) > 9 ? d.getMonth() + 1 : '0' + (d.getMonth() + 1);
dd = d.getDate() > 9 ? d.getDate() : '0' + d.getDate();
return yy + "-" + mm + "-" + dd;
} /*
* 根据月份查询排班结果
* @param month: 指定月份,整型数字1-12
*/ function schedueByMonth(month) {
let dates = [],
weekData = [],
weekDataFinal = [],
d, m, w, weekNum, lastWeek, lastWeekDiff = [];
let formatMonth = month > 9 ? month : '0' + month;
for (let i = 0; i <= 31; i++) {
d = getDateData(formatMonth, i);
m = new Date(d).getMonth() + 1;
if (m === month) {
dates.push(d)
}
}
w = new Date(dates[0]).getDay();
if (w > 0) {
for (let j = 0; j < w - 1; j++) {
dates.unshift('')
}
} else if (w === 0) {
for (let j = 0; j < 6; j++) {
dates.unshift('')
}
}
//dates分组:每组7天
for (let i = 0; i < dates.length; i = i + 7) {
weekDataFinal.push(dates.slice(i, i + 7));
}
//最后一行不够7个,则补齐
lastWeek = weekDataFinal[weekDataFinal.length - 1];
if (lastWeek.length < 7) {
for (let k = 0; k < (7 - lastWeek.length); k++) {
lastWeekDiff.push('')
}
lastWeek = lastWeek.concat(lastWeekDiff)
weekDataFinal[weekDataFinal.length - 1] = lastWeek;
}
pendingWeekData(dates, weekDataFinal)
} function pendingWeekData(dates, weekDataFinal) {
let weekTitles = '<tr><td>星期一</td><td>星期二</td><td>星期三</td><td>星期四</td><td>星期五</td><td>星期六</td><td>星期日</td></tr>';
let scheduDom = '',
weeksDom = '',
weekDom = '';
weekDataFinal.forEach(function(item) {
item.forEach(function(subItem) {
weekDom += '<td attr-date="' + subItem + '">' + delWithDay(subItem) + '</td>';
})
weeksDom += '<tr>' + weekDom + '</tr>';
weekDom = '';
})
scheduDom = weekTitles + weeksDom;
$('#schedue').html(scheduDom); //加入业务数据
let date = ['2019-12-07', '2019-12-12', '2019-12-31']; //date为接口返回的排班时间,形如:['2019-12-07', '2019-12-12', '2019-12-28']
delWithSchedue(dates, date)
} function delWithSchedue(dates, date) {
let pesoDates = date; //date为接口返回的排班时间
let index;
if (pesoDates.length > 0) {
pesoDates.forEach(function(item, index) {
index = dates.indexOf(item)
$('#schedue').find('td').eq(index + 7).addClass('active').click(function() {
alert($(this).attr('attr-date'))
})
})
}
} function delWithDay(day) {
if (day) {
return new Date(day).getDate()
} else {
return ''
}
}
//调用实例
schedueByMonth(12)

  

线上DEMO:

https://codepen.io/kevinInsight/pen/omPeMM

   

Javascript:日期排班功能实现的更多相关文章

  1. 使用SQL语句使数据从坚向排列转化成横向排列(排班表)

    知识重点: 1.extract(day from schedule01::timestamp)=13 Extract 属于 SQL 的 DML(即数据库管理语言)函数,同样,InterBase 也支持 ...

  2. (排班表一)使用SQL语句使数据从坚向排列转化成横向排列

    知识重点: 1.extract(day from schedule01::timestamp)=13 Extract 属于 SQL 的 DML(即数据库管理语言)函数,同样,InterBase 也支持 ...

  3. 详解 OneAlert 排班可以帮你做什么

    排班的存在,实质是通过有序安排,降低企业/团队人力成本,提升工作效率. 阅读导航(预计2min)   1. 详解排班功能 轮班机制 工作时间 双视图展示 灵活调整 2. 利用排班如何助力运维团队 排班 ...

  4. js jquery 实现 排班,轮班,日历,日程。使用fullcalendar 插件

    如果想用fullcalendar实现排班功能,或者日历.日程功能.那么只需要简单的几步: 这里先挂官网链接: fullcalendar fullcalendar官网下载链接 一.下载及简单配置 1.这 ...

  5. 运维告警排班太复杂?试试Cloud Alert智能告警排班

    前言: 之前的几篇文章有说过,通过智能告警平台Cloud Alert,将指定条件的告警以多样化的通知方式,通知到指定的人,其中的通知的方式包含电话.短信.邮件.微信.APP.钉钉等. 本篇文章就来说下 ...

  6. Moment.js 超棒Javascript日期处理类库

    Moment.js 不容错过的超棒Javascript日期处理类库 主要特性: 3.2kb超轻量级 独立类库,意味这你不需要倒入一堆js 日期处理支持UNIX 时间戳,String,指定格式的Date ...

  7. c++实现医院检验科排班程序

    c++实现医院检验科排班程序 1.背景: 医院急诊检验科24h×7×365值班.工作人员固定.採取轮班制度.确保24h都有人值班. 本文就通过C++实现编敲代码自己主动排班,并能够转为Excel打印. ...

  8. (排班表二)后台动态绘制Grid表格

    后台动态绘制值班表(Grid表格 列名不固定) 要求:表头除了值班人姓名,还要显示日期,及每天的星期值,用斜杠‘/’分隔.即:几号/星期几 最终实现的效果:根据查询的年月显示每个值班人查询月份每天的值 ...

  9. [Javascript] 5个最佳的Javascript日期处理类库

    在大家日常网站开发和web应用开发中,我们往往需要有效的调用Javascript处理日期和时间格式相关的函数,在Javascript中已经包含了部分最基本的内建处理方法. 在大家日常网站开发和web应 ...

随机推荐

  1. 前端生成二维码 - Javascript生成二维码(QR)

    前段时间项目中需要动态的生成二维码,经过评估,前后端生成都可以.但后端生成会有两个问题: 没有找到正规发布出来的后端开源库. 二维码图片,会随着商品的增加而不断变多. 基于以上两个问题,决定在前端生成 ...

  2. Array.prototype.slice用法详解

    slice方法是定义在js数组原型中的方法,用于截取数组的部分元素,具体使用如下: arrayExample.slice(start, end); start为起始元素位置,end为截止元素位置,如: ...

  3. 【转】H5+css布局+js+前端和移动端ui+其他汇总

    无意间发现一个博客比较好,由于内容比较多,就把链接转过来,先保存着方便看的时候看. 感谢博主“张果” +++++++++++++++++++++++++++++++++++++++++++++++++ ...

  4. Python_11-正则表达式

    目录: 1.1      引言 1.2      python 正则式概述及常用字符 1.2.1       元字符 1.2.2       用 "" 开始的特殊字符所表示的预定义 ...

  5. 112. Path Sum (Tree; DFS)

    Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all ...

  6. make: *** No rule to make target `build', needed by `default'. Stop.

    [root@xx nginx-1.8.0]# makemake: *** No rule to make target `build', needed by `default'.  Stop. [ro ...

  7. NodeJS - npm WARN package.json : No repository field:can not open package.json

    最近在研究node.js,在安装npm的时候发现了几个报错,瞬间蒙圈,查找文献基本解决(文献好少呀~  -.-)   一.报错:“can not open  path/path/package.jso ...

  8. 621. Task Scheduler CPU任务间隔分配器

    [抄题]: Given a char array representing tasks CPU need to do. It contains capital letters A to Z where ...

  9. 17. Merge Two Binary Trees 融合二叉树

    [抄题]: Given two binary trees and imagine that when you put one of them to cover the other, some node ...

  10. 8-全排列next_permutation

    C++中全排列函数next_permutation 用法 转载 2017年03月29日 14:38:25 1560 全排列参考了两位的博客 感谢! http://blog.sina.com.cn/s/ ...