Java Calendar 练习题:为孙工找到当月休息日

  • 题目
  • 难点分析
    • 怎么进行格式化输出,达到图中的展示效果?
      • 制表符:\t
      • System.out.printf("%-8s",字符串)
    • 怎么判断是不是休息日?
    • 月份和星期所对应的数字
  • 代码
  • 测试结果

题目

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

难点分析

怎么进行格式化输出,达到图中的展示效果?

制表符:\t

目前网络上对于\t的解释都是:\t是补全当前字符串长度到8的整数倍。我今天用Idea测试发现\t是补齐到4的倍数!百思不得其解!实际上,这跟你使用的平台有关:

  • Eclipse
    补全当前字符串长度到8的整数倍,补齐后长度为8*k个空格的长度。

  • Idea
    补全当前字符串长度到4的整数倍,补齐后长度为4*k个空格的长度。

注意:一个汉字占的空格数不是1个,看起来是1.几个。

在Eclipse和Idea使用同一段代码:

System.out.println("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六");
System.out.println("12345678123456781234567812345678123456781234567812345678");
System.out.println();
System.out.println("日\t一\t二\t三\t四\t五\t六");
System.out.println("1234123412341234123412341234");
System.out.println();
System.out.println("ddw\twfw\tw\twd\tj\tmm\ty");
System.out.println("1234123412341234123412341234");
System.out.println();
System.out.println("星期日哈哈哈\t星期一哈哈哈\t星期二哈哈哈\t星期三哈哈哈\t星期四哈哈哈\t星期五哈哈哈\t星期六哈哈哈");
for(int i=1;i<=7;i++){System.out.print("123456789---");
}
System.out.println();

Idea:
补齐长度分别为:8、4、4、12,是4的倍数。

Eclipse:
补齐长度分别为:8、8、8、16,是8的倍数。

System.out.printf("%-8s",字符串)

意为:将字符串补齐到8个字符的长度,在字符串右边用空格补齐,即左对齐。

注意:\t是补齐到多少个空格的长度,这里是补齐到多少个字符的长度,它们都用空格来补齐。汉字是字符,但其长度看起来比数字、空格、字母长。

当字符串为汉字时,用该方式补齐后显示的长度,与当字符串为数字、字母时的长度,是不一样的。

(经验证,这种补齐方式与平台无关。)

添加“-”方便比对字符个数。

System.out.printf("%-8s","星期日");
System.out.println("end");
System.out.println("星期日-----");
System.out.printf("%-8s","星");
System.out.println("end");
System.out.println("星-------");System.out.printf("%-8s","123");
System.out.println("end");
System.out.println("123-----");System.out.printf("%-8s","12");
System.out.println("end");
System.out.println("12------");System.out.printf("%-8s","abc");
System.out.println("end");
System.out.println("abc-----");
System.out.printf("%-8s","a1");
System.out.println("end");
System.out.println("a1------");

怎么判断是不是休息日?

2020-02-02是第一次休息日,之后每上3天班,就休息一次,即每4天休息一次。算出当日与首次休息日之间差了多少天,如果是4的倍数,就表明是休息日。

计算两个日期差了多少天,关键是得到两个日期的格林威治时间之差,需要用到Calendar、Date、SimpleDateFormat,思路请见下图。

补充:什么是格林威治时间?
从UTC:格林威治时间1970年01月01日00时00分00秒(UTC+8北京时间1970年01月01日08时00分00秒)到现在过了多少毫秒。

月份和星期所对应的数字

月份:0-11,不是1-12
星期日:1,星期六:7,星期一到五:2-6

代码

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Scanner;public class WorkCalendar {public static Scanner input = new Scanner(System.in);public static void main(String[] args) throws ParseException {System.out.println("***欢迎使用工作日/休息日查询系统!***");System.out.print("请输入年:");int year = inputNum(2020,2080);System.out.print("请输入月:");int month = inputNum(1,12);//创建日历类的对象Calendar c = Calendar.getInstance();//设置日历的年月日c.set(Calendar.YEAR,year);//注意计算机中的月份:0-11c.set(Calendar.MONTH,month-1);c.set(Calendar.DATE,1);//判断日历初始值是星期几int dayOfWeek = c.get(Calendar.DAY_OF_WEEK);//System.out.println("dayOfWeek:"+dayOfWeek);//获取本月的最大天数int dayNumOfMonth = c.getActualMaximum(Calendar.DATE);//System.out.println("dayNumOfMonth:"+dayNumOfMonth);//打印日历的抬头System.out.println("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六");//打印第一行日期的空格for(int i=1; i<=dayOfWeek-1; i++) {//java里的\t是补全当前字符串长度到8的整数倍,最少1个最多8个字符//“%-8s"在变量的右边缩进8个字符(左对齐)System.out.printf("%-8s","");}//本月休假天数int relaxDays = 0;//本月休假的周末天数int relaxWeekends = 0;for(int i=1;i<=dayNumOfMonth;i++){//设置日c.set(Calendar.DATE,i);//得到当前日期与初始日期:2020.2.2相差的天数int intervalDays = intervalDays(c);//判断该天是不是休息日//隔3天休息一次,即每4天休息一次if(intervalDays%4 == 0){//补齐为8个字符,有[]System.out.printf("%-8s","["+i+"]");relaxDays++;//判断是否周末//注意:1:周日,7:周六if(c.get(Calendar.DAY_OF_WEEK) == 1 || c.get(Calendar.DAY_OF_WEEK) == 7){relaxWeekends++;}}else{//补齐为8个字符,无[]System.out.printf("%-8s",i);}//如果该天是周六,换行//注意:1:周日,7:周六if(c.get(Calendar.DAY_OF_WEEK) == 7){System.out.println();}}System.out.println();System.out.println("本月休息天数有:"+relaxDays+"天");System.out.println("本月轮到周末休息天数是"+relaxWeekends+"天");}/*** 让用户输入指定范围内的数* @param min 范围下限* @param max 范围上限* @return 数*/public static int inputNum(int min,int max){//全局代码都用nextLine,不会因为输入产生冲突,还可以更好的接受各种类型的数据String str = input.nextLine();int num = -1;//1.将String转化为Int,如果输入的字符串无法转化为Int,会产生异常try{num = Integer.parseInt(str);}catch (NumberFormatException e){System.out.println("输入有误,请重新输入。");//重新输入return inputNum(min,max);}//2.判断值是否在正确范围里if(num<min || num>max){System.out.println("输入有误,请重新输入。");return inputNum(min,max);}return num;}/*** 计算当前日期与初始日期之间差了多少天* @param c 当前日期* @return 间隔天数* @throws ParseException*/public static int intervalDays(Calendar c) throws ParseException {//创建Date对象Date d = c.getTime();//得到格林威治时间long end = d.getTime();//创建日期格式,用于记录初始日期SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");//将初始日期转化为Date对象Date initialDate = format.parse("2020-02-02");//得到初始日期的格林威治时间long start = initialDate.getTime();//计算两个格林威治时间的差,得出两个日期的相隔天数//1天有24小时,1小时有60分钟,1分钟有60秒,1秒有1000毫秒int intervalDays = (int) ((end - start)/(24*60*60*1000));//初始日期是第一个休息日,在此之前的日期,要么没有开始工作,要么是工作日if (end-start<0){return -1;}return intervalDays;}}

测试结果


Java Calendar类 练习题:为孙工找到当月休息日相关推荐

  1. 利用Java Calendar类打印日历

    利用Java Calendar类打印日历 说到日历,我们接触的就多了,每天都在和日历打交道,每年家里都会买日历.那么,大家知道如何用Java打印日历呢?在这里,我说一下如何用Calendar类打印日历 ...

  2. Java Calendar类知识点总结

    (1)Calendar类在java.util包中,使用Calendar类的static方法getInstance()可以初始化一个日历对象,如:Calendar calendar=Calendar.g ...

  3. Java Calendar 类的使用(日期处理二)

    在JAVA中获取当前时间,可以使用 java.util.Date 类和 java.util.Calendar 类完成.其中,Date 类主要封装了系统的日期和时间的信息,Calendar 类则会根据系 ...

  4. java calendar类_Java Calendar类

    Calendar类概述 /*** java.util.Calendar类:是一个日历类 * Calendar类是一个抽象类,里边提供了很多操作日历字段的方法 * 如:YEAR. MONTH. DAY ...

  5. Java Calendar 类的时间操作

    Java Calendar 类时间操作,这也许是创建和管理日历最简单的一个方案,示范代码很简单. 演示了获取时间,日期时间的累加和累减,以及比较. 原文地址:blog.csdn.NET/joyous/ ...

  6. 【_ 記 】Java Calendar类详解(今年 本月 今日 去年 上月 昨日)

    一.构造方法 protected Calendar() :由于修饰符是protected,所以无法直接创建该对象.需要通过别的途径生成该对象. 二.成员方法 Calendar类的成员方法 static ...

  7. Java Calendar 类的格式操作

    Java Calendar 类时间操作,这也许是创建日历和管理最简单的一个方案,示范代码很简单. 演示了获取时间,日期时间的累加和累减,以及比较. 注意事项: Calendar 的 month 从 0 ...

  8. Java Calendar类

    Calendar类是一个抽象类,它为毫秒值与YEAR.MONTH等日历字段之间的转换提供了一些方法,并为操作日历字段提供了一些方法. 1.Calendar日历字段 1.1.Calendar.YEAR ...

  9. java calendar类_2020 年,你还在使用 Java 中的 SimpleDateFormat 吗?

    今天我和大家一起聊一聊SimpleDateFormat ,这都2020年了,怎么还在用SimpleDateFormat ? 其实,作为一名Java 程序员,我们会经常在编程时候和时间打交道,比如要把某 ...

最新文章

  1. C++添加程序到windows的启动项的代码
  2. pandas Timestamp的用法
  3. 关于AXI DMA CYCLIC 调试过程中的问题
  4. Python和OpenCV环境配置
  5. 图像滤波 Image Filtering
  6. mint ui datetimepicker 手机端jquery datetimepicker 总结应用
  7. LoadRunner界面分析(二)
  8. graphpad两组t检验_独立双样本检验(假设检验)
  9. python高阶_Python高阶学习
  10. 克服大数据集群的挑战
  11. 开源日志审计系统_详解mysql数据库审计特点、实现方案及审计插件部署演示
  12. google地图静态api使用助手(html源码)
  13. 中英文1:2等宽字体
  14. linux ftp 测网速,武汉电信使用FTP测试网速
  15. 抖音反编译学习(记录草稿)
  16. mysql5.6.1安装步骤_mysql5.6安装步骤
  17. mate20pro怎样装鸿蒙系统,华为放大招!华为Mate20系列也能拍月亮,以后还能升级鸿蒙...
  18. MaskRNN Instance Level Video Object Segmentation 论文翻译
  19. Netty面试题(史上最全)
  20. 传智播客凭什么改变IT教育

热门文章

  1. 详解Dialog(二)——有关列表的构建
  2. Qualcomm平台 AEE运行机制的深入剖析
  3. ECMall 商城源码下载以及使用说明
  4. ENSP演示:配置LACP模式的链路聚合
  5. 前端的架构设计与演化实例
  6. 请问人类科技发展的重大里程碑有哪些
  7. 2022年(第13届蓝桥杯省赛)Python 14 天夺奖冲刺营
  8. 国美扔出三帖良药不再沉默
  9. java编译器——安装IDEA 步骤
  10. 【笑话】悟空评职称记