关于#java#的问题:编程实现一个万年历的创建,能够根据输入的年打印一整年的日历情况,能够根据输入的年月打印一整月的情况,并可以打印指定的如2000年至2023年的日历情况

编程实现一个万年历的创建,能够根据输入的年打印一整年的日历情况,能够根据输入的年月打印一整月的情况,并可以打印指定的如2000年至2023年的日历情况。(JAVA基础大一)

大概实现如下:

img


import java.util.Calendar;
import java.util.Scanner;

public class CalendarPrinter {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        while (true) {
            System.out.println("----------万年历----------");
            System.out.println("1. 打印整年日历");
            System.out.println("2. 打印指定年份范围内所有日历");
            System.out.println("3. 打印指定月份日历");
            System.out.println("4. 退出程序");

            int choice = scanner.nextInt();

            switch (choice) {
                case 1:
                    System.out.println("请输入年份:");
                    int year = scanner.nextInt();
                    printYearCalendar(year);
                    break;
                case 2:
                    System.out.println("请输入起止年份:");
                    int startYear = scanner.nextInt();
                    int endYear = scanner.nextInt();
                    printRangeCalendar(startYear, endYear);
                    break;
                case 3:
                    System.out.println("请输入年份和月份:");
                    year = scanner.nextInt();
                    int month = scanner.nextInt();
                    printMonthCalendar(year, month);
                    break;
                case 4:
                    System.out.println("程序已退出!");
                    return;
                default:
                    System.out.println("请输入正确的选项数字!");
            }
        }
    }

    // 打印整年日历
    private static void printYearCalendar(int year) {
        System.out.println(year + "年日历");
        for (int month = 1; month <= 12; month++) {
            printMonthCalendar(year, month);
            System.out.println();
        }
    }

    // 打印指定年份范围内所有日历
    private static void printRangeCalendar(int startYear, int endYear) {
        for (int year = startYear; year <= endYear; year++) {
            printYearCalendar(year);
            System.out.println();
        }
    }

    // 打印指定月份日历
    private static void printMonthCalendar(int year, int month) {
        System.out.println(month + "月日历");
        System.out.println("日\t一\t二\t三\t四\t五\t六");

        // 设置Calendar对象
        Calendar calendar = Calendar.getInstance();
        calendar.set(year, month - 1, 1);

        int weekday = calendar.get(Calendar.DAY_OF_WEEK) - 1; // 获取这个月第一天是星期几
        int daysOfMonth = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); // 获取这个月有多少天

        // 打印第一行
        for (int i = 0; i < weekday; i++) {
            System.out.print("\t");
        }
        for (int i = 1; i <= 7 - weekday; i++) {
            System.out.print(i + "\t");
        }
        System.out.println();

        // 打印剩余行
        int count = 7 - weekday;
        for (int i = count + 1; i <= daysOfMonth; i++) {
            System.out.print(i + "\t");
            if (i % 7 == count % 7) {
                System.out.println();
            }
        }
        System.out.println();
    }
}

运行截图:

img

Date类:

 
 
import java.util.Scanner;
 
public class Date {
    private int mYear;
 
    //获取年
    public int getmYear() {
        return mYear;
    }
    //设置年
    public void setmYear(int mYear) {
        this.mYear = mYear;
    }
 
    //判断是否是闰年
    public boolean ioleapyear(int year){
        if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
            return true;
        else
            return false;
    }
 
    //判断是否是闰年  无参
    public boolean ioleapyear(){
        return ioleapyear(mYear);
    }
 
    //返回年的累加天数
    private int calMonth(int year, int month)    {
        int shift = 0;
        if (ioleapyear(year))
            shift = 1;
        switch (month)    {
        case 0:return 0;
        case 1:return 31;
        case 2:return 31 + 28 + shift;
        case 3:return 31 + 28 + 31 + shift;
        case 4:return 31 + 28 + 31 + 30 + shift;
        case 5:return 31 + 28 + 31 + 30 + 31 + shift;
        case 6:return 31 + 28 + 31 + 30 + 31 + 30 + shift;
        case 7:return 31 + 28 + 31 + 30 + 31 + 30 + 31 + shift;
        case 8:return 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + shift;
        case 9:return 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + shift;
        case 10:return 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + shift;
        case 11:return 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + shift;
        case 12:return 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + 31 + shift;
        default:return 0;
        }
    }
 
 
    // 判断某天是周几
    public int weekofday(int year, int mon, int day) {
        // 1900-1-1 星期一 
        int days = 0;
        if (year < 1900){
            //1.计算从year+1到1900年的天数
            for (int y = year + 1; y < 1900; y++) {
                if (ioleapyear(y))
                    days += 366;
                else
                    days += 365;
            }
            //2.year年的天数
            if (ioleapyear(year))
                days += 366 - calMonth(year, mon - 1) - day;
            else
                days += 365 - calMonth(year, mon - 1) - day;
 
 
            int wk = days % 7;
            return (7 - wk);
        }
        else {
            //1.计算从1900年到year的天数
            for (int y = 1900; y < year; y++) {
                if (ioleapyear(y))
                    days += 366;
                else
                    days += 365;
            }
            //2.year年的天数
            days += calMonth(year, mon - 1) + day - 1;
 
            int wk = days % 7 + 1;
            return wk;
 
        }
 
    }
 
    //显示星期几
    public void disp(int wk) {
        switch (wk) {
        case 1:
            System.out.print("星期一\n"); break;
        case 2:
            System.out.print("星期二\n"); break;
        case 3:
            System.out.print("星期三\n"); break;
        case 4:
            System.out.print("星期四\n"); break;
        case 5:
            System.out.print("星期五\n"); break;
        case 6:
            System.out.print("星期六\n"); break;
        case 7:
            System.out.print("星期日\n"); break;
        }
    }
    // 获取月份的天数
    public int monthday(int y,int mon){
        int arr[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
        if (ioleapyear(y))
            arr[2] = 29;
        return arr[mon];
    }
 
    //显示某年某月的日历
    public void showRl(int year, int mon) {
        int day, wk, days;
        int i, j;
        String weeks[] = { "  ","一","二","三","四","五","六","日" };//仿windows日历显示
        days = monthday(year, mon);
        for (i = 1; i <= 7; i++){
            if(i%2==1)
                System.out.printf("%4s ", weeks[i]);
            else
                System.out.printf(" %4s ", weeks[i]);
        }
            
            
        System.out.println();
        for (day = 1; day <= days; day++)
        {
            wk = weekofday(year, mon, day);
            if (day == 1)
            {
                for(j=1;j<wk;j++)
                    System.out.print("    ");
            }
            if(wk != 7)
                System.out.printf("%3d ", day);
            else
                System.out.printf("%3d\n", day);
        }
        System.out.println();
        System.out.println();
    }
 
    //显示某年的日历
    public void showYear(int year) {
        int i = 1;
        for (; i <= 12; i++)
        {
            System.out.println(year+"年"+i+"月日历:");
            showRl(year, i);
        }
    }
 
 
 
}
 
 

WanNianli类(调用Date类的方法):

 
import java.util.Scanner;
 
public class WanNianli {
    //主程序
        public static void main(String[] argv){
            Scanner sc = new Scanner(System.in);
            Date dt = new Date();
            int year,mon,day;
            int flag = 1;
            while(flag == 1){
                System.out.print("***************************************\n");
                System.out.print("                 万年历                \n");
                System.out.print("1.查询某年某月某日星期几\n");
                System.out.print("2.判断某年是否是闰年\n");
                System.out.print("3.查询某月的最大天数\n");
                System.out.print("4.打印某年的全年日历\n");
                System.out.print("5.打印某年某月的日历\n");
                System.out.print("0.退出程序\n");
                System.out.print("***************************************\n");
                System.out.print("请选择:");
                int choise = sc.nextInt();
                switch(choise){
                case 0: flag = 0;break;
                case 1:
                    System.out.print("请输入年 月 日:");
                    year = sc.nextInt();
                    mon = sc.nextInt();
                    day = sc.nextInt();
                    int wk = dt.weekofday(year, mon, day);
                    dt.disp(wk);
                    break;
                case 2:
                    System.out.print("请输入年份:");
                    year = sc.nextInt();
                    if (dt.ioleapyear(year))
                        System.out.printf("%d年是闰年\n", year);
                    else
                        System.out.printf("%d年不是闰年\n", year);
                    break;
                case 3:
                    System.out.print("请输入年月:");
                    year = sc.nextInt();
                    mon = sc.nextInt();
                    
                    System.out.printf("%d年%d月的最大天数是%d\n", year, mon, dt.monthday(year, mon));
                    break;
                case 4:
                    System.out.print("请输入年:");
                    year = sc.nextInt();
                    dt.showYear(year);
                    break;
                case 5:
                    System.out.print("请输入年月:");
                    year = sc.nextInt();
                    mon = sc.nextInt();
                    System.out.printf("%d年%d月日历如下:\n",year,mon);
                    System.out.print("---------------------------------\n\n");
                    dt.showRl(year,mon);
                    break;
                }
            }
        }
 
}
 
 

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7505896
  • 这篇博客你也可以参考下:【Java】编写程序,输出从公元1900年到2100年所有闰年的年号,每输出5个年号换一行。
  • 同时,你还可以查看手册:java-二维图形 - 如何在应用程序中显示和打印二维图形。-打印》教你如何向打印机渲染二维图形,打印复杂的文件,以及使用打印服务。-使用打印服务和属性的工作 中的内容
  • 除此之外, 这篇博客: Java身份证号脱敏、校验身份证号合法性、根据身份证号获取年龄、根据生日获取年龄中的 身份证号合法性校验 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • /**
     * 身份证号合法性校验
     *
     * @param idCard
     * @return String
     */
    public static boolean isLegalIDCard(String idCard) {
      boolean res = false;
      // 校验规则(15或是18位身份证号码)
      if (isMatches(idCard)) {
          if (idCard.length() == 18) {
              char[] idCardArray = idCard.toCharArray();
              // 前十七位加权因子
              int[] idCardWi = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
              // 除以11后,可能产生的11位余数对应的验证码
              String[] idCardY = {"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"};
              int total = 0;
              for (int i = 0; i < idCardWi.length; i++) {
                  int count = Integer.parseInt(String.valueOf(idCardArray[i])) * idCardWi[i];
                  total += count;
              }
              // 最后一位校验码
              int idCardModify = total % 11;
              if (idCardY[idCardModify].toUpperCase().equals(String.valueOf(idCardArray[17]).toUpperCase())) {
                  res = true;
              } else {
                  System.out.println(idCardY[idCardModify].toUpperCase());
                  res = false;
              }
          } else {
              res = true;
          }
      }
      return res;
    }
    
    private static boolean isMatches(String idCard) {
      if (StringUtils.isBlank(idCard)) {
          return false;
      }
      String regex = "(^[1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$)|"
              + "(^[1-9]\\d{5}\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}$)";
      return idCard.matches(regex);
    }
    

  • 您还可以看一下 刘英杰老师的Java程序员面试宝典视频课程之正则表达式(十五)课程中的 14-01 正则表达式是用来做什么的?小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    这是一个比较全面的日历程序,但需要将其完善一下来满足题目的需求。

    首先是根据输入的年份打印出该年的所有日历情况,这部分已经在参考资料的代码中完成了,可以直接使用。可以设置一个输入年份的变量,然后在循环中依次计算出1900年~该年份的所有日历情况,然后打印出来。

    接着是根据输入的年月打印出该月的所有日历情况,同样也已经在参考资料的代码中完成。除了输入年份的变量外,还需要新增一个输入月份的变量,然后在循环中依次计算出该年份1月~该月份的所有日期,然后打印出来。

    最后是能够指定打印某一年范围内的日历情况,例如指定2000年至2023年范围内的日历情况。这部分可以新建一个函数,接收起始年份和结束年份,然后依次调用“根据输入的年份打印出该年的所有日历情况”的方法,打印出所有年份的日历情况即可。

    完整代码如下:

    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    import java.util.Date;
    import java.util.Scanner;
    
    public class CalendarProgram {
    
        public static void main(String[] args) {
            Scanner input = new Scanner(System.in);
            System.out.println("请选择操作:");
            System.out.println("1. 根据年份打印日历");
            System.out.println("2. 根据年月打印日历");
            System.out.println("3. 打印指定年份范围内的日历");
    
            int choice = input.nextInt();
            switch (choice) {
                case 1:
                    System.out.println("请输入年份:");
                    int year = input.nextInt();
                    printCalendarByYear(year);
                    break;
                case 2:
                    System.out.println("请输入年份:");
                    int year2 = input.nextInt();
                    System.out.println("请输入月份:");
                    int month = input.nextInt();
                    printCalendarByMonth(year2, month);
                    break;
                case 3:
                    System.out.println("请输入起始年份:");
                    int startYear = input.nextInt();
                    System.out.println("请输入结束年份:");
                    int endYear = input.nextInt();
                    printCalendarByRange(startYear, endYear);
                    break;
                default:
                    break;
            }
        }
    
        /**
         * 根据输入的年份打印出该年的所有日历情况
         */
        public static void printCalendarByYear(int year) {
            for (int i = 1; i <= 12; i++) {
                printCalendarByMonth(year, i);
            }
        }
    
        /**
         * 根据输入的年月打印出该月的所有日历情况
         */
        public static void printCalendarByMonth(int year, int month) {
            int day = 0;
            for (int i = 1900; i < year; i++) {
                if ((i % 4 == 0 && i % 100 != 0) || (i % 400 == 0)) {
                    day += 366;
                } else {
                    day += 365;
                }
            }
            for (int i = 1; i < month; i++) {
                if (i == 2) {
                    if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
                        day += 29;
                    } else {
                        day += 28;
                    }
                } else if (i == 4 || i == 6 || i == 9 || i == 11) {
                    day += 30;
                } else {
                    day += 31;
                }
            }
            int weeks = day % 7;
            int day2 = 0;
            switch (month) {
                case 2:
                    if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
                        day2 += 29;
                    } else {
                        day2 += 28;
                    }
                    break;
                case 4:
                case 6:
                case 9:
                case 11:
                    day2 = 30;
                    break;
                default:
                    day2 = 31;
                    break;
            }
            System.out.println(String.format("%d年%d月", year, month));
            System.out.println("一\t二\t三\t四\t五\t六\t日");
            for (int i = 1; i <= weeks; i++) {
                System.out.print(" \t");
            }
            for (int i = 1; i <= day2; i++) {
                System.out.print(i + "\t");
                if ((i + weeks) % 7 == 0) {
                    System.out.println();
                }
            }
        }
    
        /**
         * 打印指定年份范围内的日历情况
         */
        public static void printCalendarByRange(int startYear, int endYear) {
            for (int year = startYear; year <= endYear; year++) {
                printCalendarByYear(year);
            }
        }
    }
    

该回答参考ChatGPT:
好的,这个需求可以通过编写一个简单的程序来实现。以下是一个基本的实现思路:

首先,我们需要获取用户输入的年份和月份。可以使用Java中的Scanner类来获取用户输入。

接下来,我们需要计算出指定年份的日历情况。可以使用Java中的Calendar类来计算。

对于整年的日历情况,我们需要循环遍历每个月份,并调用Calendar类来计算每个月份的日历情况。

对于指定年份范围内的日历情况,我们需要循环遍历每一年,并在每一年内循环遍历每个月份,调用Calendar类来计算每个月份的日历情况。

最后,我们需要将计算出的日历情况输出到控制台上,可以使用Java中的System.out.println()方法来实现。

以下是一个简单的Java代码示例,可以实现上述功能:

import java.util.Calendar;
import java.util.Scanner;

public class CalendarDemo {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入年份:");
        int year = scanner.nextInt();
        System.out.print("请输入月份(不输入则打印整年):");
        int month = scanner.nextInt();
        if (month == 0) {
            printYearCalendar(year);
        } else {
            printMonthCalendar(year, month);
        }
    }

    private static void printYearCalendar(int year) {
        for (int i = 1; i <= 12; i++) {
            printMonthCalendar(year, i);
        }
    }

    private static void printMonthCalendar(int year, int month) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(year, month - 1, 1);
        int firstDayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
        int maxDayOfMonth = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
        System.out.println(year + "年" + month + "月");
        System.out.println("日\t一\t二\t三\t四\t五\t六");
        for (int i = 1; i < firstDayOfWeek; i++) {
            System.out.print("\t");
        }
        for (int i = 1; i <= maxDayOfMonth; i++) {
            System.out.print(i + "\t");
            if ((i + firstDayOfWeek - 1) % 7 == 0) {
                System.out.println();
            }
        }
        System.out.println();
    }
}


这个程序可以根据用户输入的年份和月份,打印出对应的日历情况。如果用户不输入月份,则会打印出整年的日历情况。如果需要打印指定年份范围内的日历情况,可以在printYearCalendar()方法中添加循环遍历的逻辑即可。

以下答案由GPT-4.5Plus大模型(语音)与博主A努力中.......共同编写:

这里是一个Java程序实现一个打印万年历的功能:

java
import java.util.Scanner;

public class Calendar {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        System.out.print("请输入年份:");
        int year = in.nextInt();

        // 打印整年日历
        printYearCalendar(year);

        System.out.print("请输入年和月份(如2020 12):");
        year = in.nextInt();
        int month = in.nextInt();

        // 打印整月日历
        printMonthCalendar(year, month);

        System.out.print("请输入起始年份和结束年份(如2000 2023):");
        int startYear = in.nextInt();
        int endYear = in.nextInt();

        // 打印指定年份段的日历
        printCalendar(startYear, endYear);
    }

    // 打印一整年的日历
    public static void printYearCalendar(int year) {
        // 获取每月的天数
        int[] days = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
        // 闰年的二月天数为29天
        if (isLeapYear(year)) days[1] = 29;

        // 打印每个月的头部信息及日历
        for (int i = 0; i < 12; i++) {
            System.out.printf("\n          %d年%d月\n", year, i + 1);
            System.out.printf("  周日  周一  周二  周三  周四  周五  周六\n");
            printMonthCalendar(year, i + 1, days[i]);
        }
    }

    // 打印一个月的日历
    public static void printMonthCalendar(int year, int month) {
        // 获取月份天数
        int days = getDaysOfMonth(year, month);

        // 打印日历头部
        System.out.printf("\n          %d年%d月\n", year, month);
        System.out.printf("  周日  周一  周二  周三  周四  周五  周六\n");

        // 打印日历主体
        printMonthCalendar(year, month, days);
    }

    // 具体打印某月日历的方法
    public static void printMonthCalendar(int year, int month, int days) {
        // 获取该月第一天是周几
        int week = getFirstDayOfWeek(year, month);

        // 打印日历
        for (int i = 0; i < week; i++) System.out.print("    ");
        for (int i = 1; i <= days; i++) {
            System.out.printf("%4d", i);
            if ((i + week - 1) % 7 == 0) System.out.println();
        }
        System.out.println();
    }

    // 打印指定年份段的日历
    public static void printCalendar(int startYear, int endYear) {
        for (int year = startYear; year <= endYear; year++) {
            printYearCalendar(year);
            System.out.println();
        }
    }
}

该程序实现了:

  1. 根据输入年份,打印整年日历。
  2. 根据输入年月,打印整月日历。
  3. 根据起始年份和结束年份,打印指定年份段的日历。

通过调用不同方法,实现了输入不同参数,打印相应范围内的日历。