某公司软件开发工程师孙工,作息规律为上三天班,休息一天,经常不确定休 息日是否周末,为此,请你开发一个程序,当孙工输入年及月,以日历方式显示对 应月份的休息日,用中括号进行标记.同时,统计出本月有几天休息,轮到周末休 息有几天.(注:首次休息日是2020年2月2日)
要想解决这道题,首先我们要弄懂日历类是什么,该怎么用,然后才是去想判断的逻辑关系。本人也是刚学不久,理解的也不是很全面,在这里我只分享一下在做本题时的想法和思路。
首先日历类我们不是new出来的,是通过Calendar c1 = Calendar.getInstance();获取的,所以我简单的理解为这个日历类本来就存在在电脑里,我们只是拿来用。我们获取了之后,就可以设置年、月(这也是用户需要输入的内容),然后日历类就定位到了我们设置的那一个月的日历。这时候我们想要的数据都可以通过日历类的各种方法进行获取。
其次就是判断的逻辑关系了,我要判断某一天是否休息,那么我先找一个时间零点(这里我找的就是2020-2-1),然后通过for循环去获取当月的每一天,通过格林威治时间可以计算出这中间间隔天数,然后再通过间隔天数除四取余,判断这一天是否休息。
代码如下:
public class Views {
private Scanner s = new Scanner(System.in);
/**
* 让用户输入年的操作
* @return
*/
public int year(){
System.out.println("欢迎使用XX日历系统");
System.out.println("请输入你想要查找的年:");
String text = s.nextLine();
int year = -1;
try{
year = Integer.parseInt(text);
}catch (NumberFormatException e){
}
return year;
}
/**
* 让用户输入月的操作
* @return
*/
public int month(){
System.out.println("请输入你想要查找的月:");
String text = s.nextLine();
int mon = -1;
try{
mon = Integer.parseInt(text)-1;
}catch (NumberFormatException e){
}
if(mon < 0&& mon >11){
System.out.println("输入有误,请重新输入:");
return month();
}
return mon;
}
}
public class PrintCalendar {
public static void main(String[] args) throws ParseException {
//新建输入的对象
Views view = new Views();
int year = view.year();
int mon = view.month();
//获取一个日历类的对象
Calendar c1 = Calendar.getInstance();
//设置日历的年,月,这就相当于用户输入年月后,我们需要先定位到当前月的日历
c1.set(Calendar.YEAR,year);
c1.set(Calendar.MONTH,mon);
//先判断本月的第一天是星期几
int week = c1.get(Calendar.DAY_OF_WEEK);
//获取本月的最大天数
int dayOfMonth = c1.getActualMaximum(Calendar.DAY_OF_MONTH);
//打印日历
//首先打印第一行星期的日期
System.out.println("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六");
//然后打印第一行的空格
for(int i=1; i<week; i++) {
System.out.printf("%-8s","");
}
//定义两个变量,统计本月休息天数和在休息日休息天数
int relaxdays = 0;
int relaxCount = 0;
//然后打印这个月的每一天的信息
for(int i=1; i<=dayOfMonth; i++){
//这里先设置一下这是哪年哪月哪天,
c1.set(Calendar.DAY_OF_MONTH,i);
//然后将其转换为格林威治时间,然后和前面的2020-2-1进行计算,得出这里面相隔了多少天
//将上述思想包装成一个方法,方便思考
Date temp = c1.getTime();
int days = intervalDays(temp);
//判断这一天是否休息
if(days%4 == 1){
System.out.printf("%-8s","["+c1.get(Calendar.DAY_OF_MONTH)+"]");
relaxdays++;
//判断这一天是否是休息日
if(c1.get(Calendar.DAY_OF_WEEK) ==1 ||c1.get(Calendar.DAY_OF_WEEK) == 7){
relaxCount++;
}
}else{
System.out.printf("%-8s",c1.get(Calendar.DAY_OF_MONTH));
}
//如果这一天是星期六,则换行
if(c1.get(Calendar.DAY_OF_WEEK) == 7){
System.out.println();
}
}
System.out.println();
System.out.println("本月一共休息天数"+relaxdays);
System.out.println("本月休息日休息天数"+relaxCount);
}
//计算间隔时间的方法
public static int intervalDays(Date now)throws ParseException{
//获取日历中第i天的格林威治时间
long timeEnd = now.getTime();
//创建一个格式化日期类的模板,获取一下2020-02-01的格林威治时间
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date date = format.parse("2020-02-01");
long timeStart = date.getTime();
//计算两个时间戳相隔的天数
int days = (int)((timeEnd - timeStart)/(24*60*60*1000));
return days;
}
}
代码第一个view类就是一个接收用户输入的功能,这里我写的比较多,也可以写简单点,直接写在打印日历类里面。
本人初学java,如果有什么错误之处,欢迎各位大佬指正。