给老孙做了个排班表!
碎碎念
不是吧,阿sir,996还不让人摸鱼,BOOS果断让人事部做出计划整改,改就改吧.为什么让我来写这个那,我自己制裁我自己可还行,看了看自己不争气的花呗!整啊,加油啊打工人.
背景
某公司软件开发工程师孙工,作息规律为上三天班,休息一天,经常不确定休
息日是否周末,为此,请你开发一个程序,当孙工输入年及月,以日历方式显示对
应月份的休息日,用中括号进行标记.同时,统计出本月有几天休息,轮到周末休
息有几天.(注:首次休息日是 2020 年 2 月 2 日)
产品经理
嘀嘀嘀嘀 , 产品经理将界面和需求一股脑发了过来.
产品界面:
需求概述:
- 获得输入数据:年,月
- 通过计算进行展示
- 同步输出统计信息
- 程序回到下一次的输入数据状态
大战开始
话不多说! 开撸开撸,刚开始撸,bug漫天飞,我摸摸了本来头发就不多的头皮,自己开撸.终于在下班前撸了出来.想了想mvc,还是算了吧,老老实实写写得了.
MVC的概念,将数据操作层,流程控制层和视图层尽可能分开,这样每个模块之间的关联尽可能地变小(低耦合),在编写大项目时可以使得程序整体逻辑清晰可见,易于维护和修改,体现出java的核心优势之一
需求分析(三步走战略)
第一,最明显的需要打印出一个日历来
第二,需要标记出孙工的休息日用[ ]标记出来
第三,需要算出来,孙工在他查询的那个月有几天的休息日,并且休息日有几天在周末
具体实现
接收用户输入的年份和月份
有人要问,为啥你接收个数据还要另外写个函数那?我说年轻人,年份和月份老讲究的,一不小心就有一些夸张的事情了.
- 年份:老张2020才营业,你写前面就不合适了吧,还有老张不会在公司干的寿终正寝吧!
- 月份:一年也就12个月,你在创造点可还行!
int year = -1 ;int month = -1;System.out.println("请输入年份:");year = input(2020,2080);System.out.println("请输入月份:");month = input(1,12);
/*** 1.接收数据 2.排除非法数据* @param min* @param max* @return*/public static int input(int min,int max) {String input = scanner.nextLine();int number = -1;try {number = Integer.parseInt(input);} catch (NumberFormatException e) {System.out.println("输入有误,请重新输入!");return input(min, max);}if (number < min || number > max) {System.out.println("输入有误,请重新输入!");return input(min,max);}return number;}
Calendar类的使用
将获取到的数据进行处理:
- 月份: 这里有个细节,月份是从0开始的,就是0月对应的是1月,所以输入的值要减一.
- 获得每个月的一号是星期几
- 算算每个月的天数
- 打印一下表头和那个第一行的空格
- 空格数等于 = 一号对应星期数- 1
jdk11中常量的描述:
//创建日历类对象Calendar calendar = Calendar.getInstance();/*** 设置年 月(0-11) 日*/calendar.set(Calendar.YEAR,year);calendar.set(Calendar.MONTH,month-1);calendar.set(Calendar.DATE,1);//判断日历的初始值是星期几int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);//System.out.println(dayOfWeek);//获取本月的最大天数int daysMaxOfMonth = calendar.getActualMaximum(Calendar.DATE);//System.out.println(daysMaxOfMonth);//打印日历表头System.out.println("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六");for(int i = 1;i <= dayOfWeek - 1; i++){System.out.printf("%-8s","");}
这个时候,我看了看关于几个变量的描述:
jdk11中关于使用getActualMaximum方法的描述
public int getActualMaximum(int field)
给定此Calendar的时间值,返回指定日历字段可能具有的Calendar 。 例如, MONTH字段的实际最大值在某些年份为12,在希伯来日历系统中为其他年份的13。
此方法的默认实现使用迭代算法来确定日历字段的实际最大值。 如果可能,子类应该使用更有效的实现来覆盖它。
计算(抠脚丫子功夫)
//本月休假天数int relaxDays = 0;//本月休假的周末天数int relaxWeekends = 0;for (int i = 1;i <= daysMaxOfMonth;i++) {//设置日calendar.set(Calendar.DATE, i);//得到当地日期与初始日期:2020.2.2 差的天数int intervalDays = intervalDays(calendar);//判断该天是不是休息日if (intervalDays % 4 == 0) {System.out.printf("%-8s","["+i+"]");relaxDays++;if (calendar.get(Calendar.DAY_OF_WEEK) == 1 ||calendar.get(Calendar.DAY_OF_WEEK) == 7) {relaxWeekends++;}} else {System.out.printf("%-8s",i);}if(calendar.get(Calendar.DAY_OF_WEEK) == 7){System.out.println();}}System.out.println();System.out.println("本月休息的天数:"+relaxDays+"天");System.out.println("本月轮到周末休息的天数:"+relaxWeekends+"天");}
计算距离初始日期(2020.02.02)的方法
public static int intervalDays(Calendar c) throws ParseException {//创建date对象Date date = c.getTime();//得到格林威治时间long to = date.getTime();//创建日期格式,用于记录初始日期SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");//将初始日期转化为Date对象Date initialDate = format.parse("2020-02-02");//得到初始日期格林威治时间long from = initialDate.getTime();//计算两个格林威治时间的差,得到两个日期的相隔天数int intervalalDays = (int) ((to - from) / (24 * 60 * 60 * 1000));//初始日期是第一个休息日,在此之前不算if(to - from < 0){return -1;}return intervalalDays;}
客官看到这了就给个赞吧!!!(需要源码的,私我呦!)
给老孙做了个排班表!相关推荐
- excel自动排班表怎么做?哪里有免费的自动排班表?2022最新整理30份Excel自动排班表,建议收藏
你还在手动排班吗?别再这样做了,我有更高效的方法! 在工作中,我们经常需要进行排班,不管是假期值班,还是直播排班,都需要做一个排班表.以前的时候排班都是手动调的,你周一我周二,但这种做法效率比较低,而 ...
- php mysql 排班表_要做排班表 灵活性比较强的
没做过,求高人 给点思路 回复讨论(解决方案) 能把你具体的需求说的更加清楚么?这样很难有人会回答! 能把你具体的需求说的更加清楚么?这样很难有人会回答! 需求是这样的:有白班 夜班 是上6天休息一天 ...
- 用 顶部tab栏 做排班表
用 顶部tab栏 做排班表 入职快两个月了,老大要求 做一个固定格式的医院预约挂号排班表,要求用 vue + vant 做.在网上搜了一下子,都很乱,不适合,一狠心 就自己试着写了一个,因为技术很菜 ...
- 0 基础学脚本:给同事做一个排班表并每日通知「02」
Hello 小伙伴们早上.中午.下午.晚上.深夜好! 我是爱折腾的 jsliang~ 本系列文章和配套直播视频,面向金山文档的「轻维表」「表单」用户. 希望通过[自动化]和[脚本]等能力,让里面数据相 ...
- 解决 用vue+vant 写顶部tab栏 做排班表的bug
主要的更改是解决了 日期能到 31/32 的问题,实现了到月底自动切换到下一月的1号 这里博主自己封了一个新的函数 主要用到了 setDate()这个 时间函数 //获取几天后日期dateCount( ...
- 用python做了一个统计排班表
打开程序中,输入当月日期 上传下图中每周的排班表, 上传后,点击扫描, 点击生成奖金表 当出现"已制作成功" 就可以打开奖金表. 会自动生成奖金表 其实这表格,只能算是统计每个人当 ...
- 这样做excel排班表,省时又省力,附加模板~
如何做好一个排班表? 一个完整的 Excel 排班表应该包含以下内容: 员工信息:包括员工姓名.员工编号.职位等基本信息. 日期和时间:排班表应该有一个日期和时间的列,用于记录每天的排班情况. 班次/ ...
- php日历排班表,日历排班表软件下载
日历排班表软件app是一款掌上智能排版助手.日历排班表软件app主要为有倒班.值班需求的工作人员提供智能排班功能,您可以通过日历排班表软件app输入对应的数据,就可以精准算出自己的上班.值班时间,非常 ...
- php mysql 排班表_PHP倒班五班三倒
问题 : 甲乙丙丁戊五个人,一日三班(早中晚),全年轮值,做排班表 (不考虑节假日) 想法: 排班记录存数据库,或者本地缓存,方便以后查询, 代码如下: function cal_days_in_y ...
最新文章
- 20 Java程序员面试宝典视频课程之HTML5新标签、功能
- Java高并发编程(六):重入锁
- 银联基于OpenStack的金融私有云建设实践
- 联合国粮农组织总干事屈冬玉 对话国际农民丰收节贸易会
- 服务程序增加系统托盘
- 用keras作CNN卷积网络书本分类(书本、非书本)
- 走钢索的人---走出软件作坊:三五个人十来条枪 如何成为开发正规军(十七)...
- android mina分析,Android与Mina整合
- 数百万台车联网设备同时在线0故障,中瑞集团的云原生探索之路 | 云原生Talk
- 区分那些是属于构架方面的C++功能
- 二叉树最近公共祖先 LCA
- GitHub上如何创建文件夹
- salt 安装MySQL-python和过程
- linux格式化分区进程,Linux 硬盘格式化、分区、挂载、卸载、删除分区,Linux重新调整分区...
- sql查看服务器版本信息,怎么查看SQL Server2000的版本号
- sql server 导入excel数据表
- matlab求解微分方程解析解
- 【欧拉计划第 5 题】最小公倍数 Smallest multiple
- UDS(七)应用层 28/85
- JAVA实现功能的方法