Java找到休息日问题
核心知识
日历类:Calendar
时间类:SimpleDateFormat、Date
集合类:ArrayList
字符串类:StringBuilder(不安全的)
问题描述:
某林业工人孙工,作息规律为上三天班,休息一天,经常不确定休息日是否是周末。为此,请你开发一个程序,当孙工 输入年以及月,以日历方式显示对应月份的休息日,用中括号进行标记(可以查看以前的休息情况和将来的休息情 况)。同时,统计出本月有几天休息,轮到周末休息有几天。(注:首次休息日是2020年2月2日)
效果图:
源码
不多bb直接给出源码,超全注释
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
public class Demo4 {
public static void main(String[] args) throws ParseException {
System.out.println("请输入年:");
Scanner scanner = new Scanner(System.in);
int year = scanner.nextInt();
System.out.println("请输入月:");
int month = scanner.nextInt();
//创建一个当前日历
Calendar calendar = new GregorianCalendar();
//设置年
calendar.set(Calendar.YEAR,year);
//设置月(0-11月)
calendar.set(Calendar.MONTH,month-1);
System.out.print("星期日 星期一 星期二 星期三 星期四 星期五 星期六");
//创建一个集合用来存储该日历
List<String> arr = new ArrayList<>();
//设置日期为1
//获取该时间是星期几,星期日为1
calendar.set(Calendar.DATE,1);
int weekDay = calendar.get(Calendar.DAY_OF_WEEK);
//根据星期几给日历集合加多少个空格
for (int z=0; z<weekDay ;z++) {
arr.add(" ");
}
//统计该月有多少天休息
int count = 0;
int weekcount = 0;
//获取日历当月最大日期
int maxDate = calendar.getActualMaximum(Calendar.DATE);
for (int i=1; i<=maxDate; i++) {
//设置日期为1-最大日期
calendar.set(Calendar.DATE,i);
//把日期拼接成一个字符串
int a = calendar.get(Calendar.YEAR);
String b = String.valueOf(calendar.get(Calendar.MONTH+1));
String c = String.valueOf(calendar.get(Calendar.DATE));
if (calendar.get(Calendar.MONTH+1) < 10) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("0");
stringBuilder.append(b);
b = stringBuilder.toString();
}
if (calendar.get(Calendar.DATE) < 10){
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("0");
stringBuilder.append(c);
c = stringBuilder.toString();
}
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(a);
stringBuilder.append(b);
stringBuilder.append(c);
//创建一个时间
String date = stringBuilder.toString();
//创建一个时间格式
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd");
//把字符串转为时间格式
Date d = simpleDateFormat.parse(date);
//把时间,格式化为想要的格式
SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyy年MM月dd日");
String time = simpleDateFormat1.format(d);
//获取该日期
int day = calendar.get(Calendar.DATE);
//把日期转化为字符串
String newDay = String.valueOf(day);
//如果是休息日,则加个[]
if (workDay(time)) {
//StringBuilder节省内存
StringBuilder stringBuilder1 = new StringBuilder();
stringBuilder1.append("[");
stringBuilder1.append(newDay);
stringBuilder1.append("]");
newDay = stringBuilder1.toString();
//统计休息天数
count++;
//是周日的休息天数
if (calendar.get(Calendar.DAY_OF_WEEK)==1 || calendar.get(Calendar.DAY_OF_WEEK)==7){
weekcount++;
}
}else {
StringBuilder stringBuilder1 = new StringBuilder();
stringBuilder1.append(" ");
stringBuilder1.append(newDay);
stringBuilder1.append(" ");
newDay = stringBuilder1.toString();
}
if (day<10) {
StringBuilder stringBuilder1 = new StringBuilder();
stringBuilder1.append(" ");
stringBuilder1.append(newDay);
newDay = stringBuilder1.toString();
}
arr.add(newDay);
}
//打印集合
for (int j=0; j<arr.size(); j++) {
//如果有7个数就换行
System.out.print(arr.get(j)+" ");
if (j%7==0){
System.out.println();
}
}
//统计本月有多少天休息天,多少天是周末
System.out.println();
System.out.println("本月休息天数有"+count+"天");
System.out.println("本月轮到周末的休息天数是"+weekcount+"天");
}
//写一个方法:从2020年2月2日开始,每三天返回一个true代表是休息日
static boolean workDay(String input) throws ParseException {
//创建一个当前日历,可以修改
Calendar calendar = new GregorianCalendar();
//设置年
calendar.set(Calendar.YEAR,2020);
//设置月(0-11月)
calendar.set(Calendar.MONTH,1);
//设置日期
calendar.set(Calendar.DATE,2);
//创建一个集合用于存放休息日的时间
List<String> list = new ArrayList<>();
//i为休息日数量,可以随便调
for (int i=0; i<1000; i++) {
//把日期拼接成一个字符串
//把日期拼接成一个字符串
int a = calendar.get(Calendar.YEAR);
String b = String.valueOf(calendar.get(Calendar.MONTH+1));
String c = String.valueOf(calendar.get(Calendar.DATE));
if (calendar.get(Calendar.MONTH+1) < 10) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("0");
stringBuilder.append(b);
b = stringBuilder.toString();
}
if (calendar.get(Calendar.DATE) < 10){
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("0");
stringBuilder.append(c);
c = stringBuilder.toString();
}
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(a);
stringBuilder.append(b);
stringBuilder.append(c);
//创建一个时间
String date = stringBuilder.toString();
//创建一个时间格式
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd");
//把字符串转为时间格式
Date d = simpleDateFormat.parse(date);
//把时间,格式化为想要的格式
SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyy年MM月dd日");
String time = simpleDateFormat1.format(d);
//该日期是休息日存入集合中
list.add(time);
//使日历的日期不断累加4,每4天休息一次,可以修改
calendar.add(Calendar.DATE,4);
}
//判断输入的字符串是否在集合中,在就返回true
return list.contains(input);
}
}
补充
如果想要给不同的人使用这个程序,可以把workDay()方法作为一个类,用户自己输入首次休息日,以及多少天为一个休息日。
输入年月没有处理输入异常,可以补充上去。