休息日问题
某公司软件开发工程师孙工,作息规律为上三天班,休息一天,经常不确定休 息日是否周末,为此,请你开发一个程序,当孙工输入年及月,以日历方式显示对 应月份的休息日,用中括号进行标记.同时,统计出本月有几天休息,轮到周末休 息有几天.(注:首次休息日是 2020 年 2 月 2 日)
package nineFive;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
public class Demo2 {
public static void main(String[] args) throws ParseException {
System.out.println("请输入要查找的年");
Scanner scanner=new Scanner(System.in);
int year=2020;
int month=2;
try {
year=scanner.nextInt();
System.out.println("请输入要查找的月");
month=scanner.nextInt();
}catch (Exception e){
System.out.println("输入错误");
System.exit(0);
}
if (year<1970||year>2100||month<1||month>12){
System.out.println("输入错误");
System.exit(0);
}
//创建一个当前日历
Calendar calendar=new GregorianCalendar();
//给日历赋值
System.out.println("日\t\t一\t\t二\t\t三\t\t四\t\t五\t\t六");
calendar.set(Calendar.YEAR,year);
calendar.set(Calendar.MONTH,month-1);
//先将时间调整为该月1号
calendar.set(Calendar.DATE,1);
//获得该天是星期几
//星期日为1,星期一为2,以此类推
int weekDay=calendar.get(Calendar.DAY_OF_WEEK);
//创建一个集合用来存储该日历
List<String> list=new ArrayList<>();
//把日历前一行的空缺补上
for (int i=0;i<weekDay;i++){
list.add("\t");
}
//统计该月休息时间和周末休息时间
int rest=0;
int weekRest=0;
//获取当月最大天数
int max=calendar.getActualMaximum(Calendar.DATE);
for (int i=1;i<max+1;i++){
calendar.set(Calendar.DATE,i);
//把日期拼接成字符串
int a=calendar.get(Calendar.YEAR);
int b=calendar.get(Calendar.MONTH+1);
int c=calendar.get(Calendar.DATE);
String s=""+a+b+c;
if (b<10){
if (c<10){
s=""+a+0+b+0+c;
}else {
s=""+a+0+b+c;
}
}else{
if (c<0){
s=""+a+b+0+c;
}
}
//创建一个时间格式
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyyMMdd");
Date date=simpleDateFormat.parse(s);
String s1=simpleDateFormat.format(date);
//获取日期
int day=calendar.get(Calendar.DATE);
String day1=""+day;
//判断是否是休息日
if (day(s1)) {
String s2 = "[" + day1 + "]";
if (day<10){
s2=s2+"\t";
}
day1 = s2;
rest++;
if (calendar.get(Calendar.DAY_OF_WEEK) == 1 || calendar.get(Calendar.DAY_OF_WEEK) == 7) {
weekRest++;
}
}else {
day1=day1+"\t";
}
list.add(day1);
}
//打印
for (int i=0;i<list.size();i++){
System.out.print(list.get(i)+"\t");
if (i%7==0){
System.out.print("\n");
}
}
System.out.println("");
System.out.println("本月休息"+rest+"天");
System.out.println("本月周末休息"+weekRest+"天");
}
//创建方法找到休息的时间
private static boolean day(String s) throws ParseException {
//创建第一个休息日
Calendar calendar=new GregorianCalendar();
calendar.set(Calendar.YEAR,2020);
calendar.set(Calendar.MONTH,1);//0-11
calendar.set(Calendar.DATE,2);
//创建一个链表用于存放休息日
List<String> list=new ArrayList<>();
for (int i=0;i<999;i++){
//把时间拼接成字符串
int a=calendar.get(Calendar.YEAR);
int b=calendar.get(Calendar.MONTH+1);
int c=calendar.get(Calendar.DATE);
String s1=""+a+b+c;
if (b<10){
if (c<10){
s1=""+a+0+b+0+c;
}else {
s1=""+a+0+b+c;
}
}else{
if (c<0){
s1=""+a+b+0+c;
}
}
//创建规范
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyyMMdd");
//转换成时间
Date date=simpleDateFormat.parse(s1);
//再转换成字符串
String s2=simpleDateFormat.format(date);
//添加进链表
list.add(s2);
//每隔3天就是休息日
calendar.add(Calendar.DATE,4);
}
//判断输入的时间是不是再链表中
return list.contains(s);
}
}