目录
一,快递管理训练任务
描述
某公司软件开发工程师孙工,作息规律为上三天班,休息一天,经常不确定休 息日是否周末,为此,请你开发一个程序,当孙工输入年及月,以日历方式显示对 应月份的休息日,用中括号进行标记.同时,统计出本月有几天休息,轮到周末休 息有几天.(注:首次休息日是 2020 年 2 月 2 日)
1. 获得输入数据:年,月
2. 通过计算进行展示
3. 同步输出统计信息
4. 程序回到下一次的输入数据状态
代码
package com.kaikeba;
import java.math.BigDecimal;
import java.util.*;
import java.util.regex.Pattern;
public class Demo1 {
public static void main(String[] args) {
Calendar cal = Calendar.getInstance(); // 获得Calendar对象
int year = 0, month = 0; // 收集用户输入的年份和月份
int restYear = 2020, restMon = 2, restDay = 2; // 设定休息日
boolean flag = false; // 判断输入是否正确
Scanner input = new Scanner(System.in);
// 获得合法的年份
System.out.println("请输入年:");
do {
String s = input.nextLine();
if(isInteger(s)){ // 是整数
year = Integer.parseInt(s); // 字符串转换为整型
break;
}
System.out.println("年份输入有误,请重新输入:");
}while (!flag);
System.out.println("请输入月:");
// 获得合法的月份
do {
String s = input.nextLine();
if(isInteger(s)){ // 是整数
month = Integer.parseInt(s); // 字符串转换为整型
if(month >= 1 && month <= 12){ // 月份合理
break;
}
}
System.out.println("月份输入有误,请重新输入:");
}while (!flag);
// 获得用户输入日期对应的信息:
// 该月第一天对应星期几,该月有几天,日期对应的Date对象(用于获取格林威治时间毫秒数,计算与休息日相差的天数)
cal.set(Calendar.YEAR, year); // 设置用户输入的年份
cal.set(Calendar.MONDAY, month - 1); // 设置用户输入的月份
cal.set(Calendar.DATE, 1); // 设置日期为1
int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK) - 1; // 当前日期是该周的第几天
int maxDayOfMonth = cal.getActualMaximum(Calendar.DAY_OF_MONTH); // 该月的最大天数
Date userInputDate = cal.getTime(); // 获取用户输入的日期对应的Date对象
// 获得设定的休息日期对应的信息:
// 日期对应的Date对象(用于获取格林威治时间毫秒数,计算与休息日相差的天数)
cal.set(Calendar.YEAR, restYear); // 设置休息的年份
cal.set(Calendar.MONDAY, restMon - 1); // 设置休息的月份
cal.set(Calendar.DATE, restDay); // 设置休息的日期
Date restDayDate = cal.getTime(); // 获取休息的日期对应的Date对象
int diffOfDays = (int) (userInputDate.getTime() - restDayDate.getTime()) / 1000 / 60 / 60 / 24; // 当前日期与休息日期相隔天数
int restDays = 0, restDaysInWeek = 0; // 休息天数 周末休息的天数
System.out.println("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六");
for(int i = 0; i < dayOfWeek; i++){
System.out.printf("%-8s", ""); // 8个字符左对齐 java中也可以用printf函数!
}
for(int i = 1; i <= maxDayOfMonth; i++){
if(diffOfDays % 4 == 0){ // 休息日
System.out.printf("%-8s", "[" + i + "]");
restDays++;
if(dayOfWeek == 0 || dayOfWeek == 6){ // 周末休息
restDaysInWeek++;
}
}else {
System.out.printf("%-8s", i); // 工作日
}
dayOfWeek++;
if(dayOfWeek % 7 == 0){ // 一周结束,需要换行
dayOfWeek = 0;
System.out.println();
}
diffOfDays++;
}
System.out.println();
System.out.println("本月休息天数有:" + restDays +"天");
System.out.println("本月轮到周末休息天数是"+ restDaysInWeek + "天");
}
/*方法二:推荐,速度最快
* 判断是否为整数
* @param str 传入的字符串
* @return 是整数返回true,否则返回false
*/
public static boolean isInteger(String str) {
Pattern pattern = Pattern.compile("^[-\\+]?[\\d]*$");
return pattern.matcher(str).matches();
}
}
参考链接
@辣辣写代码_nanaProgrammer【Java Calendar类 练习题:为孙工找到当月休息日】
1,获得字符串对齐的灵感,Java也可以使用printf函数。
- System.out.printf("%-8s", ""); // 8个字符左对齐
2,由于平台不同IDEA和Eclipse中的\t表示格式不同:
- Eclipse(补全当前字符串长度到8的整数倍,补齐后长度为8*k个空格的长度);
- IDEA(补全当前字符串长度到4的整数倍,补齐后长度为4*k个空格的长度);
关于Date和Calendar类的使用,可以参考这里;
章节汇总在这里(づ ̄3 ̄)づ╭❤~@&再见萤火虫&【03-Java核心类库】
对学习Java感兴趣的同学欢迎加入QQ学习交流群:1126298731
有问题欢迎提问,大家一起在学习Java的路上打怪升级!(o゜▽゜)o☆[BINGO!]