//方法类,用于操作数据:
1 package DateFormatClass; 2 3 import java.text.ParseException; 4 import java.text.SimpleDateFormat; 5 import java.util.*; 6 7 public class DateDao { 8 /** 9 * 计算间隔天数 10 * @param cl 11 * @return 12 */ 13 public static int intervalNum(Calendar cl) throws ParseException { 14 //获取传入日期的Date对象 15 Date date = cl.getTime(); 16 //调用方法,获取传入时间的格林威治时间 17 long big = date.getTime(); 18 //创建日期格式化对象 19 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 20 //调用方法,设置一个默认的时间,并让他格式化 21 Date parse = sdf.parse("2020-02-02"); 22 //计算默认日期的格林威治时间 23 long small = parse.getTime(); 24 int intervalDay = (int)(big-small)/(1000*60*60*24); 25 26 if((big-small)<0){ 27 return -1; 28 } 29 return intervalDay; 30 } 31 }
//视图类:用于提醒用户输入,并将输入的值返回出去
1 package DateFormatClass; 2 3 import java.util.Scanner; 4 5 public class Views { 6 private static Scanner input = new Scanner(System.in); 7 public int inputNum(int min,int max){ 8 System.out.println("请根据需求输入一个合法的数字"); 9 String s = input.nextLine(); 10 int num = -1; 11 try{ 12 num = Integer.parseInt(s); 13 }catch (NumberFormatException e){ 14 System.out.println("你输入的不是数字,请重新输入"); 15 inputNum(min,max); 16 } 17 if(num<min || num>max){ 18 System.out.println("你输入的数字范围不对,请重新输入"); 19 inputNum(min,max); 20 } 21 return num; 22 } 23 }
//这是测试类,用来调度数据处理和视图的关系
1 package DateFormatClass; 2 3 import java.text.ParseException; 4 import java.util.Calendar; 5 6 import static DateFormatClass.DateDao.intervalNum; 7 8 @SuppressWarnings("all") 9 public class Test { 10 public static void main(String[] args) throws ParseException { 11 //创建视图对象 12 Views views = new Views(); 13 System.out.println("请输入年份"); 14 int year = views.inputNum(2020, 9999); 15 System.out.println("请输入月份"); 16 int month = views.inputNum(1, 12); 17 18 //创建日期类对象 19 Calendar cl = Calendar.getInstance(); 20 //设置默认值 21 cl.set(Calendar.YEAR, year); 22 cl.set(Calendar.MARCH, month - 1); 23 cl.set(Calendar.DATE, 1); 24 //判断初始日期是星期几 25 int dayOfWeek = cl.get(Calendar.DAY_OF_WEEK); 26 //获取本月最大的天数 27 int dayNumberOfMonth = cl.getActualMaximum(Calendar.DATE); 28 //打印日期的抬头 29 System.out.println("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六"); 30 //打印日期第一排空格 31 for (int i = 1; i <= dayOfWeek - 1; i++) { 32 System.out.printf("%-8s", ""); 33 } 34 //本月休假天数 35 int relaxDays = 0; 36 //本月休假的周末天数 37 int relaxWeekends = 0; 38 39 40 for (int i = 1; i <= dayNumberOfMonth; i++) { 41 //设置日 42 cl.set(Calendar.DATE, i); 43 //得到当前日期与初始日期:2020.2.2相差的天数 44 int intervalDays = intervalNum(cl); 45 46 //判断该天是不是休息日 47 //隔3天休息一次,即每4天休息一次 48 if (intervalDays % 4 == 0) { 49 //补齐为8个字符,有[] 50 System.out.printf("%-8s", "[" + i + "]"); 51 relaxDays++; 52 //判断是否周末 53 //注意:1:周日,7:周六 54 if (cl.get(Calendar.DAY_OF_WEEK) == 1 || cl.get(Calendar.DAY_OF_WEEK) == 7) { 55 relaxWeekends++; 56 } 57 } else { 58 //补齐为8个字符,无[] 59 System.out.printf("%-8s", i); 60 } 61 62 //如果该天是周六,换行 63 //注意:1:周日,7:周六 64 if (cl.get(Calendar.DAY_OF_WEEK) == 7) { 65 System.out.println(); 66 } 67 68 } 69 System.out.println(); 70 System.out.println("本月休息天数有:" + relaxDays + "天"); 71 System.out.println("本月轮到周末休息天数是" + relaxWeekends + "天"); 72 } 73 74 }