概述:
某公司软件开发工程师孙工,作息规律为上三天班,休息一天,经常不确定休息日是否周末,为此,请你开发一个程序,当孙工输入年及月,以日历方式显示对应月份的休息日,用中括号进行标记.同时,统计出本月有几天休息,轮到周末休息有几天.(注:首次休息日是 2020 年 2 月 2 日)
步骤
1.获取年月(键盘输入),简单的判断和异常处理
//获取年份
public static int getYear(){
int year = -1;
System.out.println("请输入年:");
String theYear = input.nextLine();
try{//输入的一定是一个数字
year = Integer.parseInt(theYear);
}catch (NumberFormatException e){
System.out.println("请输入数字!");
}
//孙工工作了好多年啊~~~~
if(year < 2020 || year > 2100){
System.out.println("输入的年份有误,请重新输入!");
return getYear();
}
return year;
}
//获取月份
public static int getMonth(){
int month = -1;
System.out.println("请输入月:");
String theMonth = input.nextLine();
try{//输入的一定是一个数字
month = Integer.parseInt(theMonth);
}catch (NumberFormatException e){
System.out.println("请输入数字!");
}
//月份只能从1到12
if(month < 1 || month > 12){
System.out.println("输入的月份有误,请重新输入!");
return getMonth();
}
return month;
}
2.获取孙工的休息日(调用方法并保存到一个全局数组中)
数组中的休息日字符串要进行格式化如:2020年2月2日格式化为20200202,如果不格式化如:2020年1月12日(2020112)和2020年11月2日(2020112)会混淆,格式化后的字符串为20200112、20201102
//先获取休息日,用一个全局数组来保存日期
static void restDay(){
int MAX_REST_DAY = 10000;//我们要找多少个休息日
Calendar calendar = Calendar.getInstance();
//设置首个休息日时间,月份实际为2月
calendar.set(2020, 1, 2);
//这儿是找最大休息日天数个休息日,上面可以修改
for(int i = 0; i < MAX_REST_DAY; i ++){
//获得年月日
String y = String.valueOf(calendar.get(Calendar.YEAR));
String m = String.valueOf(calendar.get(Calendar.MONTH) + 1);
String d = String.valueOf(calendar.get(Calendar.DATE));
//将得到的月份和天数格式设置为两位数形式,不足两位的前面用0补全
if ((calendar.get(Calendar.MONTH) + 1) < 10) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("0");
stringBuilder.append(m);
m = stringBuilder.toString();
}
if (calendar.get(Calendar.DATE) < 10){
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("0");
stringBuilder.append(d);
d = stringBuilder.toString();
}
//拼接成字符串
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(y);
stringBuilder.append(m);
stringBuilder.append(d);
//利用变量date保存日期值
String date = stringBuilder.toString();
//该日期是休息日,存入list数组中
list.add(date);
//日历的日期加四(每隔三天休息)
calendar.add(Calendar.DATE, 4);
}
}
3.先得到输入的年份月份的每一天的格式化字符串,然后判断是否为休息日及周末休息日,是休息日就添加上[],休息日天数加一,是周末休息日,周末休息日天数加一
//获取当月的最大日期
int maxDate = calendar.getActualMaximum(Calendar.DATE);
for(int i = 1; i <= maxDate; i ++){
calendar.set(Calendar.DATE, i);
//获取年月日
String y = String.valueOf(calendar.get(Calendar.YEAR));
String m = String.valueOf(calendar.get(Calendar.MONTH) + 1);
String d = String.valueOf(calendar.get(Calendar.DATE));
//将得到的月份和天数格式设置为两位数形式,不足两位的前面用0补全
if ((calendar.get(Calendar.MONTH) + 1) < 10) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("0");
stringBuilder.append(m);
m = stringBuilder.toString();
}
if (calendar.get(Calendar.DATE) < 10){
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("0");
stringBuilder.append(d);
d = stringBuilder.toString();
}
//拼接字符串
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(y);
stringBuilder.append(m);
stringBuilder.append(d);
//利用变量date保存格式化好的日期值
String date = stringBuilder.toString();
//获取日期
int day = calendar.get(Calendar.DATE);
//将日期转化为字符串
String newDay = String.valueOf(day);
//判断是不是休息日(数组有没有这个元素,有的话就是)
if (list.contains(date)){
//利用StringBuilder可以降低内存的消耗
// 是休息日的话就加个[]
StringBuilder stringBuilder1 = new StringBuilder();
stringBuilder1.append("[");
stringBuilder1.append(newDay);
stringBuilder1.append("]");
newDay = stringBuilder1.toString();
//是休息日的话休息天数加一
restDayCount++;
//是休息日并且是周末
if(calendar.get(Calendar.DAY_OF_WEEK) == 1 || calendar.get(Calendar.DAY_OF_WEEK) == 7){
restWeekCount++;//周末休息天数加一
}
}else {//不是休息日,不加[],但是前后各添加一个空格来对齐
StringBuilder stringBuilder1 = new StringBuilder();
stringBuilder1.append(" ");
stringBuilder1.append(newDay);
stringBuilder1.append(" ");
newDay = stringBuilder1.toString();
}
if(day < 10){//天数少于10,前面添加一个空格来对齐
StringBuilder stringBuilder1 = new StringBuilder();
stringBuilder1.append(" ");
stringBuilder1.append(newDay);
newDay = stringBuilder1.toString();
}
//添加到日历数组中
calendarList.add(newDay);
}
4.最后打印日历及统计信息
//打印
for(int j = 0; j < calendarList.size(); j ++){
System.out.print(calendarList.get(j) + " ");
if(j % 7 == 0){//七次换行
System.out.println();
}
}
//最后统计输出
System.out.println();
System.out.println("本月休息天数有:" + restDayCount + "天");
System.out.println("本月轮到周末的休息天数是" + restWeekCount + "天");
完整代码
public static Scanner input = new Scanner(System.in);
//全局数组,用来保存休息日的日期,例如第一个休息日20200202
static List<String> list = new ArrayList<>();
public static void main(String[] args) throws ParseException {
int year;//接收年份
int month;//接收月份
int restDayCount = 0;//当月休息天数
int restWeekCount = 0;//当月周末休息天数
//创建日历对象
Calendar calendar = Calendar.getInstance();
//创建一个日历集合来保存日历
List<String> calendarList = new ArrayList<>();
//获取键盘输入的年月
year = getYear();
month = getMonth();
//获取一定范围内的休息日期,用全局数组接收
restDay();
//设置年月日
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.MONTH, month - 1);
calendar.set(Calendar.DATE, 1);
//获得该月第一天是星期几,星期日为1---->星期六为7
int startDay = calendar.get(Calendar.DAY_OF_WEEK);
System.out.println("星期日 星期一 星期二 星期三 星期四 星期五 星期六");
//将第一天前面的位置用空格补齐
for(int i = 0; i < startDay; i ++){
calendarList.add(" ");
}
//获取当月的最大日期
int maxDate = calendar.getActualMaximum(Calendar.DATE);
for(int i = 1; i <= maxDate; i ++){
calendar.set(Calendar.DATE, i);
//获取年月日
String y = String.valueOf(calendar.get(Calendar.YEAR));
String m = String.valueOf(calendar.get(Calendar.MONTH) + 1);
String d = String.valueOf(calendar.get(Calendar.DATE));
//将得到的月份和天数格式设置为两位数形式,不足两位的前面用0补全
if ((calendar.get(Calendar.MONTH) + 1) < 10) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("0");
stringBuilder.append(m);
m = stringBuilder.toString();
}
if (calendar.get(Calendar.DATE) < 10){
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("0");
stringBuilder.append(d);
d = stringBuilder.toString();
}
//拼接字符串
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(y);
stringBuilder.append(m);
stringBuilder.append(d);
//利用变量date保存格式化好的日期值
String date = stringBuilder.toString();
//获取日期
int day = calendar.get(Calendar.DATE);
//将日期转化为字符串
String newDay = String.valueOf(day);
//判断是不是休息日(数组有没有这个元素,有的话就是)
if (list.contains(date)){
//利用StringBuilder可以降低内存的消耗
// 是休息日的话就加个[]
StringBuilder stringBuilder1 = new StringBuilder();
stringBuilder1.append("[");
stringBuilder1.append(newDay);
stringBuilder1.append("]");
newDay = stringBuilder1.toString();
//是休息日的话休息天数加一
restDayCount++;
//是休息日并且是周末
if(calendar.get(Calendar.DAY_OF_WEEK) == 1 || calendar.get(Calendar.DAY_OF_WEEK) == 7){
restWeekCount++;//周末休息天数加一
}
}else {//不是休息日,不加[],但是前后各添加一个空格来对齐
StringBuilder stringBuilder1 = new StringBuilder();
stringBuilder1.append(" ");
stringBuilder1.append(newDay);
stringBuilder1.append(" ");
newDay = stringBuilder1.toString();
}
if(day < 10){//天数少于10,前面添加一个空格来对齐
StringBuilder stringBuilder1 = new StringBuilder();
stringBuilder1.append(" ");
stringBuilder1.append(newDay);
newDay = stringBuilder1.toString();
}
//添加到日历数组中
calendarList.add(newDay);
}
//打印
for(int j = 0; j < calendarList.size(); j ++){
System.out.print(calendarList.get(j) + " ");
if(j % 7 == 0){//七次换行
System.out.println();
}
}
//最后统计输出
System.out.println();
System.out.println("本月休息天数有:" + restDayCount + "天");
System.out.println("本月轮到周末的休息天数是" + restWeekCount + "天");
}
//获取年份
public static int getYear(){
int year = -1;
System.out.println("请输入年:");
String theYear = input.nextLine();
try{//输入的一定是一个数字
year = Integer.parseInt(theYear);
}catch (NumberFormatException e){
System.out.println("请输入数字!");
}
//人也只能活个100岁多点,再多就不行了
if(year < 2020 || year > 2100){
System.out.println("输入的年份有误,请重新输入!");
return getYear();
}
return year;
}
//获取月份
public static int getMonth(){
int month = -1;
System.out.println("请输入月:");
String theMonth = input.nextLine();
try{//输入的一定是一个数字
month = Integer.parseInt(theMonth);
}catch (NumberFormatException e){
System.out.println("请输入数字!");
}
//月份只能从1到12
if(month < 1 || month > 12){
System.out.println("输入的月份有误,请重新输入!");
return getMonth();
}
return month;
}
//先获取休息日,用一个全局数组来保存日期
static void restDay(){
int MAX_REST_DAY = 10000;//我们要找多少个休息日
Calendar calendar = Calendar.getInstance();
//设置首个休息日时间,月份实际为2月
calendar.set(2020, 1, 2);
//这儿是找最大休息日天数个休息日,上面可以修改
for(int i = 0; i < MAX_REST_DAY; i ++){
//获得年月日
String y = String.valueOf(calendar.get(Calendar.YEAR));
String m = String.valueOf(calendar.get(Calendar.MONTH) + 1);
String d = String.valueOf(calendar.get(Calendar.DATE));
//将得到的月份和天数格式设置为两位数形式,不足两位的前面用0补全
if ((calendar.get(Calendar.MONTH) + 1) < 10) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("0");
stringBuilder.append(m);
m = stringBuilder.toString();
}
if (calendar.get(Calendar.DATE) < 10){
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("0");
stringBuilder.append(d);
d = stringBuilder.toString();
}
//拼接成字符串
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(y);
stringBuilder.append(m);
stringBuilder.append(d);
//利用变量date保存日期值
String date = stringBuilder.toString();
//该日期是休息日,存入list数组中
list.add(date);
//日历的日期加四(每隔三天休息)
calendar.add(Calendar.DATE, 4);
}
}