任务名称
某公司软件开发工程师孙工,作息规律为上三天班,休息一天,经常不确定休息日 是否周末,为此,请你开发一个程序,当孙工输入年及月,以日历方式显示对应月 份的休息日,用中括号进行标记.同时,统计出本月有几天休息,轮到周末休息有 几天.(注:首次休息日是 2020 年 2 月 2 日)。
代码及注释
代码1:数据处理部分
package com.java.task010301_002;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class FindDao {
View view = new View();
/**
* 计算休息天数,并输出日期
*/
public void calculate() throws ParseException {
//获取指定年月
int year = view.getYear();
int month = view.getMonth()-1;//类中月份范围0-11,用户输入1-12
// 使用默认时区和语言环境获得一个日历
Calendar calendar = Calendar.getInstance();
//设置当前日历为用户输入的日期
calendar.set(year,month,1);
//获取本月最大天数----DAY_OF_MONTH:get和 set字段编号表示当月的日期。
int maxDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
//判断本月第一天是星期几------DAY_OF_WEEK: get和set字段编号表示星期几
int week = calendar.get(Calendar.DAY_OF_WEEK);
//日历横头---星期显示
view.weekView();
//第一天是星期几,前面就留出多少空格,保证对齐
for (int i=1;i<week;i++){
System.out.printf("%-8s"," ");//printf输出格式----%-8s字符串,长度为8,左对齐
}
//本月休息天数
int restDay = 0;
//本月周末休息天数
int restWeekDay = 0;
//循环本月的每一天,判断是否是休息日,休息日是否是周末,并输出显示,休息日期用()圈出
for (int i=1;i<=maxDay;i++){
calendar.set(Calendar.DAY_OF_MONTH,i);//设置当前日历日期为i日
//返回Date对象表示的1970年1月1日00:00:00 GMT以来的毫秒数。
Date date = calendar.getTime();
//判断该天是否为休息日
if (isRestDay(date)){
System.out.printf("%-8s","("+calendar.get(Calendar.DAY_OF_MONTH)+")");//输出当前日期,并做出标记
restDay++;//休息日变量增加
//判断该休息日是否为周末
if (calendar.get(Calendar.DAY_OF_WEEK)==6 || calendar.get(Calendar.DAY_OF_WEEK)==6){
restWeekDay++;//周末休息天数增加
}
}else{
System.out.printf("%-8s",i);//如果不是休息日,直接输入日期
}
//每周换行显示
if (calendar.get(Calendar.DAY_OF_WEEK) == 7){
System.out.println();
}
}
System.out.println();
System.out.println("本月休息天数有:"+restDay+"天");
System.out.println("本月轮到周末休息天数有:"+restWeekDay+"天");
}
/**
* 判断是否为休息日
* @param date
* @return
* @throws ParseException
*/
public static boolean isRestDay(Date date) throws ParseException {
//SimpleDateFormat是一个用于以区域设置敏感的方式格式化和解析日期的具体类。
// 它允许格式化(日期→文本),解析(文本→日期)和规范化。
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
//设置最开始的休息日日期
Date startDate = format.parse("2020-02-02");
//得到开始日期的毫秒数
long startTime = startDate.getTime();
//得到当前日历的毫秒数
long dateTime = date.getTime();
//两个毫秒数做差,算出天数
int days = (int)((dateTime-startTime)/1000/60/60/24);
//每三天休一天,四天为一个单位,第四天就是休息日,
// 从2020-02-02开始,之前日期不算,所以毫秒数差不能为负数
if (dateTime-startTime>=0 && days%4==0){
return true;
}
return false;
}
}
代码2:数据输出展示部分 (视图部分)
package com.java.task010301_002;
import java.util.Scanner;
public class View {
Scanner input = new Scanner(System.in);
//获取年份:
public int getYear(){
System.out.println("请输入年:");
String inputYear = input.nextLine();
int year = -1;
try {
year = Integer.parseInt(inputYear);
}catch (NumberFormatException e){
}
if (year<1000 || year>10000){
System.out.println("格式输入有误,请重新输入---");
return getYear();
}
return year;
}
//获取月份
public int getMonth(){
System.out.println("请输入月份:");
String inputMonth = input.nextLine();
int month = -1;
try {
month = Integer.parseInt(inputMonth);
} catch (NumberFormatException e) {
}
if (month<1 || month>13){
System.out.println("格式输入有误,请重新输入---");
return getMonth();
}
return month;
}
//是否继续查找
public int proceedFind(){
System.out.println("是否继续查找?1.继续 0.退出");
String s = input.nextLine();
int flag = -1;
try {
flag = Integer.parseInt(s);
}catch (NumberFormatException e){
}
if (flag!=0 && flag!=1){
System.out.println("格式输入有误,请重新输入---");
return proceedFind();
}
return flag;
}
//日历横头---星期显示
public void weekView(){
System.out.println("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六");
}
}
代码3:主函数调用部分
package com.java.task010301_002;
import java.text.ParseException;
public class MainTest {
public static void main(String[] args) throws ParseException {
FindDao findDao = new FindDao();
View view = new View();
while (true){
System.out.println("-------欢迎来到工作日/休息日查询系统---------");
findDao.calculate();
//判断是否继续
int proceed = view.proceedFind();
if (proceed == 0){
System.out.println("感谢使用!");
break;
}
}
}
}
运行结果展示
注意:题目要求从2020年2月2日开始,所以我们要首先验证一下,开始时间是否符合题意。因为本人出现过这种错误,所以在此小小提醒一下。
实现继续查找功能:
实现退出功能:
总结
对之前所学的知识点做一个小小的总结,希望各位大佬不吝赐教。