万年历
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) 如果用户录入的月份不是数字,抛出异常,让程序在异常产生位置停止
如果上面两个条件都满足,证明这个字符串就是一个数字字符串,将字符串转为一个数字
int month = Inter.parseInt(String s)
数字介于1-12之间,否则格式有误
5.第三部分 日 dd
同上,日dd,也不能直接进行parseInt,因为非数字字符串会导致异常
int day = Inter.parseInt(String s)
数字介于1-31之间,否则格式有误
6.判断在4 6 9 11这四个月中,天数不能为31
int[] months = {4,6,9,11};
判断月份在数组中包含,且天数为31了,这是不符合规范的
7.对于2月份的处理
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 看余数,余数为几,就是哪一年
本年是平年还是闰年
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;
}
}
/*
* //对象用于封装日历所有信息
* */
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 + '\'' +
'}';
}
}