Java基础用Date类编写万年历

导读:本篇文章讲解 Java基础用Date类编写万年历,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

万年历
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 + '\'' +
                '}';
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/94284.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!