您好,欢迎访问代理记账网站
移动应用 微信公众号 联系我们

咨询热线 -

电话 15988168888

联系客服
  • 价格透明
  • 信息保密
  • 进度掌控
  • 售后无忧

java任务——万年历

package com.xxm.TaskA_Calendar;

/*
    目标:实现万年历,
    提示语 → 输入年份
    提示语 → 输入月份
    打印出所输入的月份的日历。

    思路:
        1.打印日历标题
        2.录入数据,判断年份是否为闰年
        3.打印提示语,录入数据,判断该月份有多少天
        4.判断该月份的一天是星期几
        5.打印

 */

import java.util.Calendar;
import java.io.*;
import java.util.ArrayList;

public class A_Calendar {

    public static void main(String[] args) throws IOException {
        //1.打印日历标题
        PrintCalendar.printTitle();


        //死循环,录入天数
        lo:
        while (true) {
            //2.录入数据,判断年份是否为闰年
            //录入
            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;
            }

            //创建 cal 对象,并将其年份设为输入值
            Calendar cal = Calendar.getInstance();
            cal.set(Calendar.YEAR, year);

            //判断闰年
            boolean leapYearOrNot;
            if (year % 400 == 0) {
                leapYearOrNot = true;
            } else if (year % 100 == 0) {
                leapYearOrNot = false;
            } else if (year % 4 == 0) {
                leapYearOrNot = true;
            } else {
                leapYearOrNot = false;
            }
            //3.打印提示语,录入数据,判断该月份有多少天
            //提示语
            System.out.print("请输入月份:");
            int month = 0;
            int days = 0;
            month = Integer.parseInt(reader.readLine());
            if (month == -1) {
                System.out.println("程序退出,谢谢使用");
                break;
            }//判断录入数据,不合理则报错并要求重新输入
            else if (month > 12 || month < 1) {
                System.out.println("输入错误,请输入正确的月份");
                continue;
            } else if (month == 2 && leapYearOrNot) {
                days = 29;
            } else if (month == 2) {
                days = 28;
            } else if (((month == 1 || month == 3) || ((month == 5) || (month == 7)) || ((month == 8 || month == 10) || month == 12))) {
                days = 31;
            } else {
                days = 30;
            }
            //设置 cal 对象的月份为输2入月份 ,注意 Canlendar 对象中月份是从零开始的
            cal.set(Calendar.MONTH, month - 1);

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

            //5.打印日历
            PrintCalendar printCal = new PrintCalendar();

            //将数据存入本月日期数临时数组中
            ArrayList<Integer> dateList = new ArrayList<>(days);

            for (int i = 0; i < days; i++) {
                dateList.add(i + 1);
            }

            //打印日历的星期数抬头
            printCal.printDayOfWeekTitle();

            //打印日期

            printCal.printDate(dateList, dayOfWeek);
        }


    }

    //打印日历类
    static class PrintCalendar {
        //打印日历标题的方法
        public static void printTitle() {
            //第一排:* 号
            for (int i = 0; i < 53; i++) {
                System.out.print('*');
            }
            System.out.println('*');

            //第二排,* 号 + 空格
            System.out.print('*');
            for (int i = 0; i < 52; i++) {
                System.out.print(' ');
            }
            System.out.println('*');


            //第三排:* 号 + 标题
            System.out.print('*');
            for (int i = 0; i < 23; i++) {
                System.out.print(' ');
            }
            System.out.print("CSDN万年历");
            for (int i = 0; i < 20; i++) {
                System.out.print(' ');
            }
            System.out.println('*');

            //第四排,* 号 + 空格
            System.out.print('*');
            for (int i = 0; i < 52; i++) {
                System.out.print(' ');
            }
            System.out.println('*');

            //第五排:* 号
            for (int i = 0; i < 54; i++) {
                System.out.print('*');
            }
            System.out.println();
            System.out.println();

        }


        //打印空格间距方法
        private void printBlankSpace() {
            System.out.print("     ");
        }

        //打印星期数的抬头
        public 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();
        }

        /*
        思路:先判断是周几,然后在临时数组前面插入相应个数的2个空字符的字符串 "  ",然后遍历打印,注意周末周日时要打印红色字体
         */
        void printDate(ArrayList<Integer> dateList, int dayOfWeek) {
            //先将 7123456 版本的星期计数切换到中国人习惯的计数
            int oneToSevenVersionDayOfWeek;
            if (dayOfWeek == 1) {
                oneToSevenVersionDayOfWeek = 7;
            } else {
                oneToSevenVersionDayOfWeek = dayOfWeek - 1;
            }

            //在传入数组前面插入相应数目(oneToSevenVersionDayOfWeek - 1)个0
            for (int i = 0; i < oneToSevenVersionDayOfWeek - 1; i++) {
                dateList.add(0, 0);
            }

            //新建一个字符串类型的辅助数组,用于打印,同时如果日期是个位数,则在后面加一个空格
            ArrayList<String> dateStrings = new ArrayList<>(dateList.size() + oneToSevenVersionDayOfWeek - 1);
            for (int i = 0; i < dateList.size(); i++) {
                if (dateList.get(i) == 0) {
                    dateStrings.add("  ");
                } else if (dateList.get(i) < 10) {
                    dateStrings.add(Integer.toString(dateList.get(i)) + " ");
                } else {
                    dateStrings.add(Integer.toString(dateList.get(i)));
                }
            }

            //遍历打印,如果为周六打印红色字体,如果是周日,则打印红色字体,且打印完数字后面的附属空格后换行。
            for (int i = 0; i < dateList.size(); i++) {
                if ((i + 1) % 7 == 1) {
                    printBlankSpace();
                    System.out.print(dateStrings.get(i));
                    printBlankSpace();
                }
                //判断周六,是则输出红色
                else if ((i + 1) % 7 == 6) {
                    System.out.print("\033[31;m" + dateStrings.get(i) + "\033[0m");
                    printBlankSpace();
                }
                //判断周日,是周日则输出红色,且输出空格后换行
                else if ((i + 1) % 7 == 0) {
                    System.out.print("\033[31;m" + dateStrings.get(i) + "\033[0m");
                    printBlankSpace();
                    System.out.println();
                } else {
                    System.out.print(dateStrings.get(i));
                    printBlankSpace();
                }
            }

        }

    }
}

实现效果如图:
在这里插入图片描述


分享:

低价透明

统一报价,无隐形消费

金牌服务

一对一专属顾问7*24小时金牌服务

信息保密

个人信息安全有保障

售后无忧

服务出问题客服经理全程跟进