万年历的黎明:全部结束

在前面解决了诸多涉及到知识点,现在终于可以开始正式讲解万年历了:

首先上图看一下最终效果:

请添加图片描述

思路:1:首先我们能想到的就是平年闰年的判断,一个返回boolean值的方法,所以我们需要单独先写一个方法:leapYearOrNot


    /**
     * 区分平年和闰年
     */
    public static boolean leapYearOrNot(int year) {
        if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
            return true;
        } else {
            return false;
        }
    }

2:然后我们发现一开始有一个“万年历“这样的动画,按照自己喜欢的方式来实现就好:PrintTitle()

 public static void PrintTitle() {


                System.out.println("******************************************************");
                System.out.println("*                                                    *");
                System.out.println("*                                                    *");
                System.out.println("*                                                    *");
                System.out.println("*                         万年历                      *");
                System.out.println("*                                                    *");
                System.out.println("*                                                    *");
                System.out.println("*                                                    *");
                System.out.println("******************************************************");
            }

3:然后首先为了保证我们可以不断地去输入年份月份去循环,先在主方法最外面写一个while:然后根据题目要求写输入年份语句:注意这里的while循环没有结束,大括号还在下面

 while (true) {
            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
            System.out.println();    //换行
            System.out.print("请输入年份:");
            int year = Integer.parseInt(reader.readLine());
            if (year == -1) {
                System.out.println("欢迎使用,已退出万年历程序,再见!");
                break;
            }

4:然后想,我们刚刚输入了日期接下来该干什么?是不是要让java知道这个日期,那么java怎样就可以知道这个日期呢?通过的就是我们前面说的Calendar:


            /**
             * 创建日历对象,并将year赋值进去给YEAR
             */
  Calendar cal = Calendar.getInstance();
            cal.set(Calendar.YEAR, year);

5:这样就是先初始化了日期然后set设置了年份为我们刚刚输入的,接下来,我们写输入月份的语句:

  System.out.print("请输入月份:");
            int mouth = 0;
            int days = 0;
            mouth = Integer.parseInt(reader.readLine());

6:然后我们在前面输入年之前判断了年的闰与平,现在应该判断月份的天数了:

  if (mouth == -1) {
                System.out.println("欢迎使用,已退出万年历程序,再见!");
                break;
            } else if (mouth >= 12 && mouth <= 9) {
                System.out.println("您输入的月份不正确,请输入1-12的数字");
            } else if (mouth == 2 && leapYearOrNot(year)) {
                days = 29;
            } else if (mouth == 2) {
                days = 28;
            } else if (mouth == 1 || mouth == 3 || mouth == 5 || mouth == 7 || mouth == 8 || mouth == 10 || mouth == 12) {
                days = 31;
            } else {
                days = 30;
            }

7:接下来同理,上面让java读懂了年份,现在让它读懂月份:

  /**
             * 设置输入的月份,但是要记住这里要减一!
             */
            cal.set(Calendar.MONTH, mouth - 1);

8:现在就是月份和年都输入并且java录入了,我们想一下打印日历是不是需要知道每个月的第一天?现在就需要用到Calendar的一个方法:

   //判断该月份的一天是星期几。注意:dayOfWeek = 1 表示周日,dayOfWeek = 2 表示周一,以此类推。
            cal.setFirstDayOfWeek(Calendar.MONDAY);
            int dayofweek;
            dayofweek = cal.get(Calendar.DAY_OF_WEEK);

8.5:一个大的日期打印类:PrintCalendar

  static class PrintCalendar {

9:接下来的方法就都是与打印相关的了,首先我们会经常用到空格,那么就写一个空格方法:printBlankSpace()

请添加图片描述

10:看图得知第一行是打印周一到周日:printDayOfWeekTitle

  public static void printDayOfWeekTitle () {
                printBlankSpace();
                System.out.print("一");
                printBlankSpace();
                System.out.print("二");
                printBlankSpace();
                System.out.print("三");
                printBlankSpace();
                System.out.print("四");
                printBlankSpace();
                System.out.print("五");
                printBlankSpace();
                System.out.print("六");
                printBlankSpace();
                System.out.print("日");
                printBlankSpace();
                System.out.println();
            }

11:我们可以看到这个日历2021年2月份,在周六之前是没有日期的,所以我们需要判断一下需要一开始打印多少空格,还有星期转化:然后这些小方法应该包含在大方法打印输出类里面:printData

11.1:先转换为中国日期:

 public static void printData (ArrayList < Integer > datalist,int dayofWeek){

                /**
                 * 转换为中国星期
                 */
                int ChinadayofWeek;
                if (dayofWeek == 1) {
                    ChinadayofWeek = 7;
                } else {
                    ChinadayofWeek = dayofWeek - 1;
                }

11.2:打印多余的空格:

    /**
                 * 将多余的0传入数组,因为不是每个月第一天都是星期一
                 */
                for (int i = 0; i < ChinadayofWeek - 1; i++) {
                    datalist.add(0, 0);     //位置和元素都为0
                }

11.3:首先说一下现在到哪一步了,图例:请添加图片描述

11.4:用辅助数组去存放需要打印的数据:

请添加图片描述

  ArrayList<String> dataStrings = new ArrayList<>(datalist.size() + ChinadayofWeek - 1);
                for (int i = 0; i < datalist.size(); i++) {
                    if (datalist.get(i) == 0) {
                        dataStrings.add("  ");

                    } else if (datalist.get(i) < 10) {
                        dataStrings.add(Integer.toString(datalist.get(i)) + " ");  //这里的Integer.toString是将日期的Integer类型转换为字符串打印输出
                    } else {
                        dataStrings.add(Integer.toString(datalist.get(i)));
                    }
                }

11.5:开始遍历打印:

  for (int i = 0; i < datalist.size(); i++) {
                    if ((i + 1) % 7 == 1) {
                        printBlankSpace();
                        System.out.print(dataStrings.get(i));
                        printBlankSpace();
                    } else if ((i + 1) % 7 == 6) {

                        System.out.print("\033[33;4m" + dataStrings.get(i) + "\033[0m");
                        printBlankSpace();

                    } else if ((i + 1) % 7 == 0) {
                        System.out.print("\033[33;4m" + dataStrings.get(i) + "\033[0m");
                        printBlankSpace();
                        System.out.println();
                    } else {
                        System.out.print(dataStrings.get(i));
                        printBlankSpace();
                    }
                }

12:回到主方法最后开始输出:

   /**
             * 打印环节--------------------------------------------------------------
             * 打印环节--------------------------------------------------------------
             * 打印环节--------------------------------------------------------------
             */

            /**
             * 打印输出日历
             */
          PrintCalendar printCalendar = new PrintCalendar();

            //将数据存入本月日期数临时数组中
            ArrayList<Integer> dataList = new ArrayList<>(days);
            for (int i = 0; i < days; i++) {
                dataList.add(i + 1);
            }
            /**
             * 打印一开始的星期
             */
            printCalendar.printDayOfWeekTitle();
            //打印日期

            printCalendar.printData(dataList,dayofweek);

全部代码:

package 任务A;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Calendar;

/**
 * @author ${范涛之}
 * @Description
 * @create 2021-11-18 10:47
 */

public class CalendarTest {



    /**
     * 区分平年和闰年
     */
    public static boolean leapYearOrNot(int year) {
        if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
            return true;
        } else {
            return false;
        }
    }

    public static void main(String[] args) throws IOException {
        /**
         * 打印标题
         */
        PrintCalendar.PrintTitle();

        /**
         * 一直输入数据,直到输入1的时候退出
         */
        while (true) {
            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
            System.out.println();    //换行
            System.out.print("请输入年份:");
            int year = Integer.parseInt(reader.readLine());
            if (year == -1) {
                System.out.println("欢迎使用,已退出万年历程序,再见!");
                break;
            }


            /**
             * 创建日历对象,并将year赋值进去给YEAR
             */
            Calendar cal = Calendar.getInstance();
            cal.set(Calendar.YEAR, year);


            /**
             * 打印提示语:
             */
            System.out.print("请输入月份:");
            int mouth = 0;
            int days = 0;
            mouth = Integer.parseInt(reader.readLine());

            /**
             * 根据平年闰年判断不同月份
             */
            if (mouth == -1) {
                System.out.println("欢迎使用,已退出万年历程序,再见!");
                break;
            } else if (mouth >= 12 && mouth <= 9) {
                System.out.println("您输入的月份不正确,请输入1-12的数字");
            } else if (mouth == 2 && leapYearOrNot(year)) {
                days = 29;
            } else if (mouth == 2) {
                days = 28;
            } else if (mouth == 1 || mouth == 3 || mouth == 5 || mouth == 7 || mouth == 8 || mouth == 10 || mouth == 12) {
                days = 31;
            } else {
                days = 30;
            }
            /**
             * 设置输入的月份,但是要记住这里要减一!
             */
            cal.set(Calendar.MONTH, mouth - 1);

            //判断该月份的一天是星期几。注意:dayOfWeek = 1 表示周日,dayOfWeek = 2 表示周一,以此类推。
            cal.setFirstDayOfWeek(Calendar.MONDAY);
            int dayofweek;
            dayofweek = cal.get(Calendar.DAY_OF_WEEK);


            /**
             * 打印环节--------------------------------------------------------------
             * 打印环节--------------------------------------------------------------
             * 打印环节--------------------------------------------------------------
             */

            /**
             * 打印输出日历
             */
          PrintCalendar printCalendar = new PrintCalendar();

            //将数据存入本月日期数临时数组中
            ArrayList<Integer> dataList = new ArrayList<>(days);
            for (int i = 0; i < days; i++) {
                dataList.add(i + 1);
            }
            /**
             * 打印一开始的星期
             */
            printCalendar.printDayOfWeekTitle();
            //打印日期

            printCalendar.printData(dataList,dayofweek);


        }
    }

    /**
     * 打印输出图案
     */
    static class PrintCalendar {


        public static void PrintTitle() {


                System.out.println("******************************************************");
                System.out.println("*                                                    *");
                System.out.println("*                                                    *");
                System.out.println("*                                                    *");
                System.out.println("*                         万年历                      *");
                System.out.println("*                                                    *");
                System.out.println("*                                                    *");
                System.out.println("*                                                    *");
                System.out.println("******************************************************");
            }


            /**
             * 打印空格
             */
            public static void printBlankSpace () {
                System.out.print("     ");
            }

            //打印星期数的抬头
            public static void printDayOfWeekTitle () {
                printBlankSpace();
                System.out.print("一");
                printBlankSpace();
                System.out.print("二");
                printBlankSpace();
                System.out.print("三");
                printBlankSpace();
                System.out.print("四");
                printBlankSpace();
                System.out.print("五");
                printBlankSpace();
                System.out.print("六");
                printBlankSpace();
                System.out.print("日");
                printBlankSpace();
                System.out.println();
            }

            /**
             * 这里的datalist指代的就是可以理解为一整行的长度,里面就包括了1号前面的空格和日期,list可以确定长度所以适合作为循环边界,dataStrings不太好空值长度
             *
             * @param datalist
             * @param dayofWeek
             */
            public static void printData (ArrayList < Integer > datalist,int dayofWeek){

                /**
                 * 转换为中国星期
                 */
                int ChinadayofWeek;
                if (dayofWeek == 1) {
                    ChinadayofWeek = 7;
                } else {
                    ChinadayofWeek = dayofWeek - 1;
                }
                /**
                 * 将多余的0传入数组,因为不是每个月第一天都是星期一
                 */
                for (int i = 0; i < ChinadayofWeek - 1; i++) {
                    datalist.add(0, 0);     //位置和元素都为0
                }


                /**
                 * 为了显示好看我们需要在日期为单个的数字后面加一个空格,这里新建了一个辅助数组
                 * dataStrings里面存放的就是实际要打印输出的东西,这里的dataStrings一共会打印三种类型的数据
                 * 1:当日期是空的时候也就是我前面所说的不是每个月都是周一的对应1号,这时前面就需要两个空格,
                 * 2:当日期是一位数的时候需要打印的就是一个空格加这个数字
                 * 3:当日期是两位数的时候就恰好去输出这个日期
                 * 总而言之就是每一个打印的都要保证两位数
                 */
                ArrayList<String> dataStrings = new ArrayList<>(datalist.size() + ChinadayofWeek - 1);
                for (int i = 0; i < datalist.size(); i++) {
                    if (datalist.get(i) == 0) {
                        dataStrings.add("  ");

                    } else if (datalist.get(i) < 10) {
                        dataStrings.add(Integer.toString(datalist.get(i)) + " ");  //这里的Integer.toString是将日期的Integer类型转换为字符串打印输出
                    } else {
                        dataStrings.add(Integer.toString(datalist.get(i)));
                    }
                }

                /**
                 * 遍历打印
                 */
                for (int i = 0; i < datalist.size(); i++) {
                    if ((i + 1) % 7 == 1) {
                        printBlankSpace();
                        System.out.print(dataStrings.get(i));
                        printBlankSpace();
                    } else if ((i + 1) % 7 == 6) {

                        System.out.print("\033[33;4m" + dataStrings.get(i) + "\033[0m");
                        printBlankSpace();

                    } else if ((i + 1) % 7 == 0) {
                        System.out.print("\033[33;4m" + dataStrings.get(i) + "\033[0m");
                        printBlankSpace();
                        System.out.println();
                    } else {
                        System.out.print(dataStrings.get(i));
                        printBlankSpace();
                    }
                }
            }
        }
    }




图片:请添加图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

water-之

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值