Muestra el calendario de un año y mes determinados, implementado en java

1. Diagrama de estructura

Inserte la descripción de la imagen aquí

2. Código

package com.zhuo.base.com.zhuo.base;

import com.sun.org.apache.xerces.internal.impl.xs.SchemaNamespaceSupport;

import java.util.Scanner;

public class PrintCalendar {
    
    
    /*main方法*/
    public static void main(String[] args) {
    
    
        Scanner input = new Scanner(System.in);
        System.out.print("Enter full year (e.g., 2012): ");//提示用户输入年份
        int year = input.nextInt();
        System.out.print("Enter month as a number between 1 and 12: ");//提示用户输入月份
        int month = input.nextInt();
        printMonth(year, month);//打印一年中某个月的日历调用
    }
    /*打印一年中一个月的日历方法*/
    public static void printMonth(int year, int month) {
    
    
        printMonthTitle(year, month);//打印日历的标题方法调用
        printMonthBody(year, month);//打印日历正文方法调用
    }
    /*打印月份标题方法 */
    public static  void printMonthTitle(int year, int month) {
    
    
        System.out.println("           " + getMonthName(month) + " " + year);
        System.out.println(" ---------------------------");
        System.out.println(" Sun Mon Tue Wed Thu Fri Sat");
    }
    /*获取月份的英文名称方法 */
    public static String getMonthName(int month) {
    
    
        String monthName = "";
        switch (month) {
    
    
            case 1: monthName = "January"; break;
            case 2: monthName = "February"; break;
            case 3: monthName = "March"; break;
            case 4: monthName = "April"; break;
            case 5: monthName = "May"; break;
            case 6: monthName = "June"; break;
            case 7: monthName = "July"; break;
            case 8: monthName = "August"; break;
            case 9: monthName = "September"; break;
            case 10: monthName = "October"; break;
            case 11: monthName = "November"; break;
            case 12: monthName = "December";
        }
        return monthName;
    }
    /*打印月体方法*/
    public static void printMonthBody(int year, int month) {
    
    
        int startDay = getStartDay(year, month);//为每月的第一个天获取一周的开始日期方法调用
        int numOfDayInMonth = getNumberOfDaysInMonth(year, month);//获取当月天数方法调用
        /* 在每月第一天之前填充空间*/
        int i = 0;
        for (i = 0; i < startDay; i++)
            System.out.print("    ");
        for (i = 1; i <= numOfDayInMonth; i++) {
    
    
            System.out.printf("%4d", i);
            if ((i + startDay) % 7 == 0)
                System.out.println();
        }
        System.out.println();
    }
    /*获取每一年每个月开始日期*/
    public static int getStartDay(int year, int month) {
    
    
        final int START_DAY_FOR_JAN_1_1800 = 3;
        int totalNumberOfDays = getTotalNumberOfDays(year, month);//获取从1800年1月1日到每一年每个月一号总天数的方法调用
        return (totalNumberOfDays + START_DAY_FOR_JAN_1_1800) % 7;//返回每一年每一个月的开始日期
    }
    /*获取自1800年1月1日以来的总天数的方法 */
    public static int getTotalNumberOfDays(int year, int month) {
    
    
        int total = 0;
        /*得到从1800年1月1号到任何一年的总天数*/
        for (int i = 1800; i < year; i++)
            if (isLeapYear(i))
                total += 366;
            else
                total += 365;
        for (int i = 1; i < month; i++) {
    
    
            total += getNumberOfDaysInMonth(year, i);//添加从一月到日历月前一个月的天数
        }
        return total;
    }
    /*获取一个月的天数的方法*/
    public static int getNumberOfDaysInMonth(int year, int month) {
    
    
        if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12)
            return 31;
        else if (month == 4 || month == 6 || month == 9 || month == 11)
            return 30;
        else
            return isLeapYear(year) ? 29 : 28;
    }
    /*确定是否是闰年的方法*/
    public static boolean isLeapYear(int year) {
    
    
        return year % 400 == 0 || (year % 4 == 0 && year % 100 != 0);
    }
}

Tres. Pantalla de resultados

Enter full year (e.g., 2012): 2021
Enter month as a number between 1 and 12: 2
           February 2021
 ---------------------------
 Sun Mon Tue Wed Thu Fri Sat
       1   2   3   4   5   6
   7   8   9  10  11  12  13
  14  15  16  17  18  19  20
  21  22  23  24  25  26  27
  28

Process finished with exit code 0

4. Diseño de arriba hacia abajo

Primero divida el problema en dos subproblemas: lea la entrada del usuario e imprima el calendario del mes.

  1. Utilice Scanner para leer la entrada del año y mes.
  2. El problema de imprimir un calendario para un mes determinado se puede dividir en dos subproblemas: imprimir el título del calendario y el cuerpo principal del calendario.
  • El título del calendario mensual consta de tres líneas: el año y el mes, la línea de puntos y el nombre de la semana de los siete días de la semana. El nombre completo del mes (por ejemplo: enero) debe determinarse por el número que representa el mes (por ejemplo: 1). Este paso lo realiza getMonthName
  • Para imprimir el cuerpo principal del calendario, necesita saber que el primer día del mes es el día de la semana (getStartDay) y cuántos días hay en el mes (getNumberOfDaysInMonth), por ejemplo: diciembre de 2013 tiene 31 días, y el 1 de diciembre de 2013 es domingo.
  1. ¿Cómo puedo saber qué día es el primer día de un mes? Hay varias formas de conseguirlo. Aquí se utiliza el siguiente método. Suponga que sabemos que el 1 de enero de 1800 es miércoles (START_DAY_F0R_JAN_l_1800 = 3) y luego calculamos el número total de días (totalNumberOfDays) entre el 1 de enero de 1800 y el primer día del mes calendario. Como hay 7 días en cada semana, la semana del primer día del mes calendario es (totalNumberOfDays + START_DAY_FOR_JAN_1_1800)% 7. De esta manera, el problema de getStartDay se puede refinar aún más en getTotalNumberOfDays.
  2. Para calcular el número total de días, necesita saber si el año es bisiesto y el número de días de cada mes. Por lo tanto, getTotalNumberOfDays se puede refinar aún más en dos subproblemas: isLeapYear y getNumberOfDaysInMonth.

Cinco. Detalles de la implementación

El método isLeapYear (int year) se puede implementar con el siguiente código:
return year% 400 == 0 || (year% 4 == 0 && year% 100! = 0);
Use los siguientes hechos para implementar getTotalNumberOfDaysInMonth (intyear .intmonth) método:
-Mes, marzo, mayo, julio, agosto, octubre y diciembre tienen 31 días. Hay 30 días en abril, junio, septiembre y noviembre. Febrero suele tener 28 días, pero hay 29 días en un año bisiesto. Por lo tanto, un año suele tener 365 días y un año bisiesto tiene 366 días.
Implemente el método getTotalNumberOfDays (int year, int month):
debe calcular el número total de días entre el 1 de enero de 1800 y el primer día del mes calendario (totalNumberOfDays). Puede encontrar el número total de días desde 1800 hasta el año calendario y luego encontrar el número total de días antes del mes calendario en el año calendario. La suma de estos dos días totales es
totalNumberOfDays.
Para imprimir el cuerpo del calendario, primero complete algunos espacios antes del primer día y luego imprima una línea para cada semana.

Supongo que te gusta

Origin blog.csdn.net/weixin_42768634/article/details/113643856
Recomendado
Clasificación