碎碎念

不是吧,阿sir,996还不让人摸鱼,BOOS果断让人事部做出计划整改,改就改吧.为什么让我来写这个那,我自己制裁我自己可还行,看了看自己不争气的花呗!整啊,加油啊打工人.

背景

某公司软件开发工程师孙工,作息规律为上三天班,休息一天,经常不确定休
息日是否周末,为此,请你开发一个程序,当孙工输入年及月,以日历方式显示对
应月份的休息日,用中括号进行标记.同时,统计出本月有几天休息,轮到周末休
息有几天.(注:首次休息日是 2020 年 2 月 2 日)

产品经理

嘀嘀嘀嘀 , 产品经理将界面和需求一股脑发了过来.

产品界面:

需求概述:

  1. 获得输入数据:年,月
  2. 通过计算进行展示
  3. 同步输出统计信息
  4. 程序回到下一次的输入数据状态

大战开始

话不多说! 开撸开撸,刚开始撸,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类的使用

将获取到的数据进行处理:

  1. 月份: 这里有个细节,月份是从0开始的,就是0月对应的是1月,所以输入的值要减一.
  2. 获得每个月的一号是星期几
  3. 算算每个月的天数
  4. 打印一下表头和那个第一行的空格
  5. 空格数等于 = 一号对应星期数- 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;}

客官看到这了就给个赞吧!!!(需要源码的,私我呦!)

给老孙做了个排班表!相关推荐

  1. excel自动排班表怎么做?哪里有免费的自动排班表?2022最新整理30份Excel自动排班表,建议收藏

    你还在手动排班吗?别再这样做了,我有更高效的方法! 在工作中,我们经常需要进行排班,不管是假期值班,还是直播排班,都需要做一个排班表.以前的时候排班都是手动调的,你周一我周二,但这种做法效率比较低,而 ...

  2. php mysql 排班表_要做排班表 灵活性比较强的

    没做过,求高人 给点思路 回复讨论(解决方案) 能把你具体的需求说的更加清楚么?这样很难有人会回答! 能把你具体的需求说的更加清楚么?这样很难有人会回答! 需求是这样的:有白班 夜班 是上6天休息一天 ...

  3. 用 顶部tab栏 做排班表

    用 顶部tab栏 做排班表 入职快两个月了,老大要求 做一个固定格式的医院预约挂号排班表,要求用 vue + vant 做.在网上搜了一下子,都很乱,不适合,一狠心 就自己试着写了一个,因为技术很菜 ...

  4. 0 基础学脚本:给同事做一个排班表并每日通知「02」

    Hello 小伙伴们早上.中午.下午.晚上.深夜好! 我是爱折腾的 jsliang~ 本系列文章和配套直播视频,面向金山文档的「轻维表」「表单」用户. 希望通过[自动化]和[脚本]等能力,让里面数据相 ...

  5. 解决 用vue+vant 写顶部tab栏 做排班表的bug

    主要的更改是解决了 日期能到 31/32 的问题,实现了到月底自动切换到下一月的1号 这里博主自己封了一个新的函数 主要用到了 setDate()这个 时间函数 //获取几天后日期dateCount( ...

  6. 用python做了一个统计排班表

    打开程序中,输入当月日期 上传下图中每周的排班表, 上传后,点击扫描, 点击生成奖金表 当出现"已制作成功" 就可以打开奖金表. 会自动生成奖金表 其实这表格,只能算是统计每个人当 ...

  7. 这样做excel排班表,省时又省力,附加模板~

    如何做好一个排班表? 一个完整的 Excel 排班表应该包含以下内容: 员工信息:包括员工姓名.员工编号.职位等基本信息. 日期和时间:排班表应该有一个日期和时间的列,用于记录每天的排班情况. 班次/ ...

  8. php日历排班表,日历排班表软件下载

    日历排班表软件app是一款掌上智能排版助手.日历排班表软件app主要为有倒班.值班需求的工作人员提供智能排班功能,您可以通过日历排班表软件app输入对应的数据,就可以精准算出自己的上班.值班时间,非常 ...

  9. php mysql 排班表_PHP倒班五班三倒

    问题 : 甲乙丙丁戊五个人,一日三班(早中晚),全年轮值,做排班表 (不考虑节假日) 想法:  排班记录存数据库,或者本地缓存,方便以后查询, 代码如下: function cal_days_in_y ...

最新文章

  1. 20 Java程序员面试宝典视频课程之HTML5新标签、功能
  2. Java高并发编程(六):重入锁
  3. 银联基于OpenStack的金融私有云建设实践
  4. 联合国粮农组织总干事屈冬玉 对话国际农民丰收节贸易会
  5. 服务程序增加系统托盘
  6. 用keras作CNN卷积网络书本分类(书本、非书本)
  7. 走钢索的人---走出软件作坊:三五个人十来条枪 如何成为开发正规军(十七)...
  8. android mina分析,Android与Mina整合
  9. 数百万台车联网设备同时在线0故障,中瑞集团的云原生探索之路 | 云原生Talk
  10. 区分那些是属于构架方面的C++功能
  11. 二叉树最近公共祖先 LCA
  12. GitHub上如何创建文件夹
  13. salt 安装MySQL-python和过程
  14. linux格式化分区进程,Linux 硬盘格式化、分区、挂载、卸载、删除分区,Linux重新调整分区...
  15. sql查看服务器版本信息,怎么查看SQL Server2000的版本号
  16. sql server 导入excel数据表
  17. matlab求解微分方程解析解
  18. 【欧拉计划第 5 题】最小公倍数 Smallest multiple
  19. UDS(七)应用层 28/85
  20. JAVA实现功能的方法

热门文章

  1. TIA PORTAL 导出导入数据块
  2. 如何销售网站上的广告位
  3. SIGCOMM13论文简要选读
  4. 微信支付:商户订单号重复
  5. dell屏幕亮度调节不了_Win10屏幕亮度调不了怎么办-百度经验
  6. iOS开发-单元测试
  7. kotlin协程+retrofit简单取消接口回调
  8. 如何理解关联法则中的三个判断准则
  9. Java服务端集成环信im即时通讯
  10. 大数据数据采集工具简介