万年历
1.提醒用户键盘录入一个指定格式的日期 yyyy-MM-dd
2.如果用户录入的日期格式不符合要求,提示录入格式有误重新录入
提示用户:请输入一个yyyy-02-28格式的日期
String date = “4个数字-2个数字-2个数字”;
3.展示用户录入的该天的信息
年
月
日
星期几
本周是本月第几周
是本年第几周
是本年的第几天
本年的生肖
本年是平年还是闰年
思路:
符合要求的日期字符串
1.必须要求字符串按照 “-” 切割,分为三部分
2.每一部分的字符串的长度有限制
第一部分 年 四位长度字符串
第二部分 月 两位长度字符串
第三部分 日 两位长度字符串
3.第一部分年,4位数字,每一位数字的值都在 0 - 9之间
4.第二部分 月 MM
int num = Inter.parseInt(String s) 如果用户录入的月份不是数字,抛出异常,让程序在异常产生位置停止
第一个M 0 1
第二个M 0 - 9
如果上面两个条件都满足,证明这个字符串就是一个数字字符串,将字符串转为一个数字
int month = Inter.parseInt(String s)
数字介于1-12之间,否则格式有误
5.第三部分 日 dd
同上,日dd,也不能直接进行parseInt,因为非数字字符串会导致异常
第一个d: 0 - 3
第二个d: 0 - 9
int day = Inter.parseInt(String s)
数字介于1-31之间,否则格式有误
6.判断在4 6 9 11这四个月中,天数不能为31
int[] months = {4,6,9,11};
判断月份在数组中包含,且天数为31了,这是不符合规范的
7.对于2月份的处理
平年2月份 28天
闰年2月份 29天
if(【1】能被4整除&&不能被100整除。
||
【2】能被400整除){
当月份为2时,日必须在 1 - 29,不在此范围之内,不符合规范
}else{
当月份为2时,日必须在 1 - 28,不在此范围之内,不符合规范
}
展示用户录入的该天的信息
“2020-06-07”
String -> Date 解析,提供一个模板,按照这个模板将字符串解析为一个Date对象
Calendar.setTime(Date date)
年
月
日
星期几 *
日 1
一 2
…
六 7
String[] arr {“”,“周日”,“周一”,…“周六”};
将数组的元素取出
本周是本月第几周
是本年第几周
是本年的第几天
本年的生肖 *
2021 牛
公元后第一个牛年,是公元几年
2021 % 12
11年是羊年
10年是马年
9年是蛇年
8年是龙年
7年是兔年
6年是虎年
5年是牛年
4年是鼠年
3年是猪年
2年是狗年
1年是鸡年
0年是猴年
任意一年 % 12 看余数,余数为几,就是哪一年
本年是平年还是闰年
实现代码01:Date类
public class Date { public static void main(String[] args) throws ParseException { Scanner sc = new Scanner(System.in); System.out.println("请输入格式为yyyy-MM-dd的日期:"); String str; while(true){ str = sc.next(); boolean flag = checkDateStr(str); if(flag){ break; }else{ System.out.println("你输入的格式有误,请重新输入!"); } } MyCalendar calendarStr = getCalendarStr(str); System.out.println(calendarStr); } public static boolean checkDateStr(String dateStr){ //1.必须要求字符串按照 "-" 切割 String[] ymdArr = dateStr.split("-"); //2、判断切割字符串是否为三段 if(ymdArr.length != 3){ return false; } //3、判断每个分割字符串的长度 if(ymdArr[0].length() != 4 || ymdArr[1].length() != 2 || ymdArr[2].length() != 2){ return false; } //4、判断年的四个数字,每个数字都在0-9范围内 for(int i=0;i< ymdArr[0].length();i++) { char c = ymdArr[0].charAt(i); if (c < '0' || c > '9') { return false; } } //5、判断月的第一个字符范围在0-1 if (ymdArr[1].charAt(0) < '0' || ymdArr[1].charAt(0) > '1') { return false; } //6、判断月的第二个字符范围在0-9 if (ymdArr[1].charAt(1) < '0' || ymdArr[1].charAt(1) > '9') { return false; } //8、证明月字符串就是一个数字字符串,将字符串转为一个数字,并且范围在1-12之间 int month = Integer.parseInt(ymdArr[1]); if (month < 1 || month > 12) { return false; } //9、判断日字符串的第一个字符范围在0-3 if (ymdArr[2].charAt(0) < '0' || ymdArr[2].charAt(0) > '3') { return false; } //10、判断日字符串的第二个字符范围在0-9 if (ymdArr[2].charAt(1) < '0' || ymdArr[2].charAt(1) > '9') { return false; } //11、判断日字符串的天数不能超过31天 int day = Integer.parseInt(ymdArr[2]); if (day < 1 || day > 31) { return false; } //12、判断在4 6 9 11这四个月中,天数不能为31 int[] arr = {4, 6, 9, 11}; if (existsNum(arr, month) && day == 31) { return false; } //13、对于2月份的处理 //平年2月份28天 //闰年2月份29天 int year = Integer.parseInt(ymdArr[0]); if(isLeapYear(year)){ //当月份为2时,日必须在 1 - 29,不在此范围之内,不符合规范 if(month == 2 && (day < 1 || day > 29)){ return false; }else if(month == 2 && (day < 1 || day >29)){ return false; } } return true; } public static boolean existsNum(int[] arr,int num){ for(int i=0;i< arr.length;i++){ if(arr[i] == num){ return true; } } return false; } public static boolean isLeapYear(int year){ if(year % 4 == 0 && year % 100 != 0){ return true; }else if(year % 400 == 0){ return true; }else{ return false; } } public static MyCalendar getCalendarStr(String dataStr) throws ParseException { //自定义一个日期格式 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); java.util.Date date = sdf.parse(dataStr); //以当前Date对象设置成Calendar Calendar calendar = Calendar.getInstance(); calendar.setTime(date); MyCalendar myCalendar = new MyCalendar(); myCalendar.setYear(calendar.get(Calendar.YEAR)); myCalendar.setMonth(calendar.get(Calendar.MONTH) + 1); myCalendar.setDay(calendar.get(Calendar.DAY_OF_MONTH)); int week = calendar.get(Calendar.DAY_OF_WEEK); myCalendar.setWeek(getWeekStr(week));// 1 - 7 周日 周一 ~ 周六 myCalendar.setWeekOfMonth(calendar.get(Calendar.WEEK_OF_MONTH)); myCalendar.setWeeOfYear(calendar.get(Calendar.WEEK_OF_YEAR)); myCalendar.setDayOfYear(calendar.get(Calendar.DAY_OF_YEAR)); myCalendar.setAnimal(getAnimal(calendar.get(Calendar.YEAR))); myCalendar.setYearType(isLeapYear(calendar.get(Calendar.YEAR)) == true ? "闰年" : "平年"); return myCalendar; } public static String getWeekStr(int week){ String[] weeks = {"","周日","周一","周二","周三","周四","周五","周六",}; return weeks[week]; } public static String getAnimal(int year){ int num = year % 12; String animal = ""; switch(num){ case 0: animal = "猴年"; break; case 1: animal = "鸡年"; break; case 2: animal = "狗年"; break; case 3: animal = "猪年"; break; case 4: animal = "鼠年"; break; case 5: animal = "牛年"; break; case 6: animal = "虎年"; break; case 7: animal = "兔年"; break; case 8: animal = "龙年"; break; case 9: animal = "蛇年"; break; case 10: animal = "马"; break; case 11: animal = "羊"; break; } return animal; } }
实现代码02:MyCalendar类
/* * //对象用于封装日历所有信息 * */ public class MyCalendar { private int year; private int month; private int day; private String week;//本周 private int weekOfMonth;//是本月第几周 private int weeOfYear;//是本年第几周 private int dayOfYear;//是本年的第几天 private String animal;//本年的生肖 private String yearType;//本年是平年还是闰年 public int getYear() { return year; } public void setYear(int year) { this.year = year; } public int getMonth() { return month; } public void setMonth(int month) { this.month = month; } public int getDay() { return day; } public void setDay(int day) { this.day = day; } public String getWeek() { return week; } public void setWeek(String week) { this.week = week; } public int getWeekOfMonth() { return weekOfMonth; } public void setWeekOfMonth(int weekOfMonth) { this.weekOfMonth = weekOfMonth; } public int getWeeOfYear() { return weeOfYear; } public void setWeeOfYear(int weeOfYear) { this.weeOfYear = weeOfYear; } public int getDayOfYear() { return dayOfYear; } public void setDayOfYear(int dayOfYear) { this.dayOfYear = dayOfYear; } public String getAnimal() { return animal; } public void setAnimal(String animal) { this.animal = animal; } public String getYearType() { return yearType; } public void setYearType(String yearType) { this.yearType = yearType; } public MyCalendar() { } public MyCalendar(int year, int month, int day, String week, int weekOfMonth, int weeOfYear, int dayOfYear, String animal, String yearType) { this.year = year; this.month = month; this.day = day; this.week = week; this.weekOfMonth = weekOfMonth; this.weeOfYear = weeOfYear; this.dayOfYear = dayOfYear; this.animal = animal; this.yearType = yearType; } @Override public String toString() { return "MyCalendar{" + "year=" + year + ", month=" + month + ", day=" + day + ", week='" + week + '\'' + ", weekOfMonth=" + weekOfMonth + ", weeOfYear=" + weeOfYear + ", dayOfYear=" + dayOfYear + ", animal='" + animal + '\'' + ", yearType='" + yearType + '\'' + '}'; } }