近期看到个需求,“配置一年的工作日”。青铜五coder手动撸了一个,效果图如下(截了上半部分),打钩了的就是工作日。

边说思路,边贴码。

每个月都是用一个<table>实现的,用循环的方式遍历出十二个<table>出来,或者手动撸十二下,,,

数据格式是一数组,长度365或366,“0”表示“非工作日”,“1”表示“工作日”,如:

[0,0,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1,0,1,1,1,1,1,0,0,0,0,0,0,0,1,1,0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1,1,0,0,0,1,1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,0,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1,1,0,0,0,1,1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1,0,0]

每个<table>有6行*7列为42个格子,12个<table>就有504个格子也就是<td>,需要做文章。头几格和后几格都不属于本月的日子,暂且叫“非日期”吧,中间的都是“日期”格子,主要就是要在这些日期格子里循环生成数字和复选框。如下图,红色格子为“非日期”。

这些“日期”和“非日期”,用一个数组来表示,“0”表示“非日期”,“1”表示“日期”,如下这一串表示2017年一月份的情况。生成代码如下下(Java)。

[0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0]
ArrayList<Integer> date = new ArrayList<>();
int x = 31;// 每个月有几天
int y = 7;// 每个方框前面空几格
for (int j = 0; j < 42; j++) {// “非日期”用“0”表示if (j < y) {date.add(0);continue;}// 周末部分,用“2”表示// if (x != 0 && (j == 0 || j == 6 || j == 7 || j == 13 || j == 14// || j == 20 || j == 21 || j == 27 || j == 28// || j == 34 || j == 35)) {// date.add(2);// x--;// continue;// }// “日期”用“1”表示if (x != 0) {date.add(1);x--;continue;}date.add(0);
}
// 打印出来看看
// System.out.println(date);

十二个月的话就循环,自己手动优化下,把x和y改成数组,记录每个月实际情况,在生成。

下面是生成页面日期和复选框,以及勾选复选框的js,主要是做好条件判断即可。

function print(json){//json是上面说到记录365或366里的工作日的数组var i = 0;//计数,记录当前遍历到第几个格子,最大值为504var j = 0;//每个月第几日,最大值由k数组控制var k = [31,28,31,30,31,30,31,31,30,31,30,31];//十二个月,每个月最大天数var l = -1;//数组k的索引var m = 0;//2017年365天计数,记录当前遍历到2017年的第几天//2017年日历,6行*7列*12个月,504个格子的数组,(不含节假日)0:非日期;1:工作日;2:周末,有没有周末的标识无所谓var date = [0, 0, 0, 0, 0, 0, 0, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 0, 0, 0, 0,0, 0, 0, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 2, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 2, 0, 0, 0, 0, 0, 0,0, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 2, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 2, 1, 0, 0, 0, 0, 0,0, 0, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 1, 2, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 0, 0, 0, 0,0, 0, 0, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 1, 2, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 2, 0, 0, 0, 0, 0, 0];//获取table下说有的td元素,做遍历$(".table").find("td").each(function(){if((i)%42==0){//计数i能被42整除,数组k的索引l,自加1l++;}if(j==k[l]){//每月第几日计数j,达到最高天数,j重置为0j=0;}if(date[i]!=0){//只要date[i]不等于0,说明是“日期”格子,这时放入日期和复选框var checked;j++;//每月第几日自加1if(json[m]!=0){checked = 'checked="checked"';}m++;//365天计数自加1$(this).html(j+"<br>"+"<input type='checkbox' name='workday' value='"+m+"' "+checked+">");}i++;});
}

前台还有从后台获取数据方面的就不贴出来了,下面说下提交后后端处理数据。

所有“checkbox”的“name”都是“workday”,“value”就是1-365或366,用个数组装好他们,然后该怎么处理就怎么处理咯。获取到的数组大致如下,就是一年的第几天第几天是工作日。

[3, 4, 5, 6, 9, 10, 11, 12, 13, 16, 17, 18, 19, 20, 22, 23, 24, 25, 26, 34, 35, 37, 38, 39, 40, 41, 44, 45, 46, 47, 48, 51, 52, 53, 54, 55, 58, 59, 60, 61, 62, 65, 66, 67, 68, 69, 72, 73, 74, 75, 76, 79, 80, 81, 82, 83, 86, 87, 88, 89, 90, 91, 95, 96, 97, 100, 101, 102, 103, 104, 107, 108, 109, 110, 111, 114, 115, 116, 117, 118, 122, 123, 124, 125, 128, 129, 130, 131, 132, 135, 136, 137, 138, 139, 142, 143, 144, 145, 146, 147, 151, 152, 153, 156, 157, 158, 159, 160, 163, 164, 165, 166, 167, 170, 171, 172, 173, 174, 177, 178, 179, 180, 181, 184, 185, 186, 187, 188, 191, 192, 193, 194, 195, 198, 199, 200, 201, 202, 205, 206, 207, 208, 209, 212, 213, 214, 215, 216, 219, 220, 221, 222, 223, 226, 227, 228, 229, 230, 233, 234, 235, 236, 237, 240, 241, 242, 243, 244, 247, 248, 249, 250, 251, 254, 255, 256, 257, 258, 261, 262, 263, 264, 265, 268, 269, 270, 271, 272, 273, 282, 283, 284, 285, 286, 289, 290, 291, 292, 293, 296, 297, 298, 299, 300, 303, 304, 305, 306, 307, 310, 311, 312, 313, 314, 317, 318, 319, 320, 321, 324, 325, 326, 327, 328, 331, 332, 333, 334, 335, 338, 339, 340, 341, 342, 345, 346, 347, 348, 349, 352, 353, 354, 355, 356, 359, 360, 361, 362, 363]
String[] workdayStr = request.getParameterValues("workday");
ArrayList<Integer> workdays = new ArrayList<>();
if (Misc.isNotEmpty(workdayStr)) {//这个是自己写的,用来检查是否“null”用的,代码要“健壮”嘛,,,for (int i = 0; i < dateCount; i++) {//“dateCount”是上面的定义的,就是一年的天数365或者366workdays.add(0);//反正就是先装一个长度为365/366的,全部是“0”的数组}for (String str : workdayStr) {int date = Integer.parseInt(str);workdays.set(date - 1, 1);//然后把对应属于工作日的,替换成1就行了。}
}
//当然也可以定义全部是“1”的数组,然后把“0”替换上去,减少循环次数

以上差不多是核心部分啦,写完之后,是时候去找找看看有没有别人已经写好的组件啥的了,找到我再贴过来。

转载于:https://my.oschina.net/u/3352206/blog/862580

手动实现一年12个月的工作日日历相关推荐

  1. mysql统计一年12个月的数据,当某个月没数据的时候自动补0

    在mysql中如何去统计12个月的数据,并且给没有数据的月份设置为0 ? 因为每个人的业务都不太一样,所以如何统计数据这个就不说了,不过我相信能看到这篇文章的人应该都已经做好数据统计,只是统计的数据并 ...

  2. js版计算连续12个月计算不超3万公里

    <!--考虑比亚迪车友不是程序员的多,写了个html版的,复制以下代码在记事本,改后缀名为test.html,然后用浏览器打开--> <!DOCTYPE html> <h ...

  3. 剑桥大学发布2019年度AI发展报告,预测未来12个月AI产业6件大事

    来源:人工智能和大数据 近日,剑桥大学发布了2019年度AI发展报告,在这份137页的报告中,涵盖了AI研究.人才.产业等多方面内容,值得一提的是,这份报告专门开辟了一个章节来介绍中国AI技术的发展. ...

  4. 12个月大厂主机免费领AWS Azure Google-Cloud还不快到碗里来

    文章目录 简介 AWS Azure Google Cloud Oracle 总结 简介 最近有个朋友问我哪里有免费主机可以领,说实话这个问题也困扰了我很久,之前也在网上寻找免费主机,可是免费的基本上都 ...

  5. 华为杨超斌:5G方面领先同行至少12个月到18个月

    [TechWeb]3月7日,华为举行发布会,会上华为5G产品线总裁杨超斌发表了演讲,针对美国政府毫无依据的安全担忧谈论了自己的看法,并介绍了华为在5G方面的进展. 杨超斌称,排除华为以及破坏公平竞争将 ...

  6. 免费12个月!阿里云助力中小企业0成本上云

    最新消息,阿里云宣布为企业用户推出云服务器免费12个月扶持计划,助力中小企业0成本上云.阿里云表示,该计划每年投入2000万,超5万中小企业受益,本计划已于2019年11月27日上线. 阿里云智能总裁 ...

  7. hutool 取前12个月_Excel – 创建 12 个月的工资表模板,我只要 20 秒

    看到这个标题,是不是以为 20 秒是在夸大其词?这还真不是! 今天的教程,每个环节我都采用了最优化的技巧,如果完全按照我的方法操作,20 秒其实都不需要. 案例: 下图 1 是一张空的全年工资表模板, ...

  8. 未来 12 个月,哪种编程语言将会流行?

    作者 | Ekaterina Novoseltseva 译者 | 明明如月,责编 | 郭芮 头图 | CSDN 下载自东方IC 出品 | CSDN(ID:CSDNnews) 以下为译文: 今年 Api ...

  9. 罗永浩回应被列老赖;三星解散自研 CPU 团队;Python 采用 12 个月的发布周期 | 极客头条...

    整理 | 屠敏 快来收听极客头条音频版吧,智能播报由标贝科技提供技术支持. 「CSDN 极客头条」,是从 CSDN 网站延伸至官方微信公众号的特别栏目,专注于一天业界事报道.风里雨里,我们将每天为朋友 ...

最新文章

  1. MySQL开启远程连接权限
  2. Swift怎么通过类名字符串来创建一个类
  3. 雷观(十一):接私活有利有弊,我们应该根据自己的实际情况选择接私活
  4. 【Android APT】注解处理器 ( 配置注解依赖、支持的注解类型、Java 版本支持 )
  5. 【Python之旅】第二篇(三):基于列表处理的购物清单程序
  6. windows下python虚拟环境virtualenv安装和使用
  7. spring 入门 1
  8. 前端学习(1723):前端系列javascript之uniapp语法下
  9. LeetCode 2148. 元素计数
  10. python整数类型没有取值范围限制_详解Python中6种数据类型
  11. Python——eventlet.wsgi
  12. kafka可视化界面kibana_kafka日志同步至elasticsearch和kibana展示
  13. java怎么引入矢量图标库,阿里巴巴矢量图标库Iconfont的使用方法
  14. 「软件」南方CASS9.1软件下载及安装注册教程
  15. Golang 流媒体音视频网络传输开源项目-LAL
  16. [论文阅读][CVPR2021]EventZoom: Learning to Denoise and Super Resolve Neuromorphic Events
  17. tf改善_如何衡量和改善自动常见问题解答
  18. layui上传文件的choose只触发一次
  19. glTF-Transform处理gltf模型
  20. 寻找两个正序数组的中位数

热门文章

  1. python-list、tuple
  2. 为什么?win10 浏览器打不开网页,显示,DNS服务器可能不可用,但能登录qq和微信,
  3. 网络问题解决—电脑能上网(QQ微信和浏览器一级网页)但浏览器打不开二级网页
  4. 【干货】python xlwt写入excel操作
  5. 从城市场景语义分割数据集中划分出自动驾驶领域道路分割数据集类别中遇到的问题
  6. BZOJ2095[Poi2010] Bridges
  7. 证券投资深度学习_Deep Gamblers: Learning to Abstain with Portfolio Theory(理解)(github代码)...
  8. UltraEdit软件列模式的一些使用技巧
  9. 微信小程序----开发rui-swiper多样式轮播组件
  10. 36条经典的编程格言(中英对照程序员个性签名)