想要通过Java实现简易的日历,相对来说较为容易,主要明确下面两个技术要点,以及实现的算法,是本次编码的最重要收获
技术要点:
1,自1990年后,“每年的1月1日是星期几”的求解方案;
a,给定1900年1月1日为星期1
b,若某一年的总天数为365天,将其除以7,得余数为1,则下一年1月1日的星期为当年1月1日的星期加1,;若某一年的总天数为356(即闰年),将其除以7,得余数为2,则下一年的1月1日的星期为当年1月1日的星期加2.
2,“每个月的1日是星期几“的求解方案
a,先计算当年1月1日对应的星期
b,从2月开始,每月1日对应的星期应为上月1日的星期个上月总天数之和除以7的余数。

import java.util.Scanner;

public class MyCanlendar {
    public static void main(String[] args)
    {
        String weeks = " Su Mo Tu We Th Fr Sa  ";   //星期列表前一个空格,后两个空格
        int i, j;   //循环控制变量
        System.out.println("Pleases input the year you want to research: ");
        int year = new Scanner(System.in).nextInt();    //输入一个int值,并赋值给year
        //用于计算给定年份一月一日为星期几,初值为1990年一月一日星期一
        int Ospa3 = 1;  
        //从1990开始,计算其后每一年的一月一日为星期几,直到求出指定年份的一月一日
        for (i = 1900; i < year; i++)
            //若是闰年,在其后年份的一月一日加两天,否则加一天
            if(i % 4 == 0 && i % 100 != 0 || i % 400 == 0)
                Ospa3 += 2;
            else
                Ospa3++;
        //由于七天为一周,所以Ospa3的最终值为模7的余数
        Ospa3 %= 7;
        System.out.println("\t\t\tCalendar of " + year);
        //输出星期列表,每行显示3个星期
        i = 1;
        while (i <= 3)
        {
            System.out.print(weeks);
            i++;
        }
        System.out.println("");
        //存放连续三个月的1日对应的星期和当月的天数
        int spa1 = 0, spa2 = 0, spa3 = 0, cou1 = 0, cou2 = 0, cou3 = 0;
        //存放连续三个月的当前日期
        int day1 = 0, day2 = 0, day3 = 0;
        //判断当年是否为闰年,为了计算当年二月份的天数
        boolean leap = year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
        for (j = 1; j <= 28; j++)
        {
            if((j - 1) % 7 == 0)
            {
                //设置连续三个月的日出输出均为一号开始
                day1 = 1;
                day2 = 1;
                day3 = 1;
                //分别设置一年中每个月1日的星期,和当月的总天数
                switch (j / 7)
                {
                    case 0:
                        spa1 = Ospa3;
                        cou1 = 31;
                        spa2 = (spa1 + cou1) % 7;
                        cou2 = leap ? 29 : 28;
                        spa3 = (spa2 + cou2) % 7;
                        cou3 = 31;
                        Ospa3 = spa3;
                        break;
                    case 1:
                        spa1 = (Ospa3 + cou3) % 7;
                        cou1 = 30;
                        spa2 = (spa1 + cou1) % 7;
                        cou2 = 31;
                        spa3 = (spa2 + cou2) % 7;
                        cou3 = 30;
                        Ospa3 = spa3; 
                        break;
                    case 2:
                        spa1 = (Ospa3 + cou3) % 7;
                        cou1 = 31;
                        spa2 = (spa1 + cou1) % 7;
                        cou2 = 31;
                        spa3 = (spa2 + cou2) % 7;
                        cou3 = 30;
                        Ospa3 = spa3;
                        break;
                    case 3:
                        spa1 = (Ospa3 + cou3) % 7;
                        cou1 = 31;
                        spa2 = (spa1 + cou1) % 7;
                        cou2 = 30;
                        spa3 = (spa2 + cou2) % 7;
                        cou3 = 31;
                        break;
                }
            }
            //在屏幕上输出日历,一行显示三个星期共输出21列
            for (i = 1; i <= 21; i++)
            {
                if ((i - 1) / 7 == 0)   //每一行的前七列输出第一个月
                    System.out.print(spa1-- <= 0 && day1 <= cou1 ? day1 < 10 ? " 0" + day1++ : " " + day1++ : "   ");
                else if ((i - 1) / 7 == 1)  //每一行的中间七列输出第二个月
                    System.out.print(spa2-- <= 0 && day2 <= cou2 ? day2 < 10 ? " 0" + day2++ : " " + day2++ : "   ");
                else    //每一行的后七列输出第三个月
                    System.out.print(spa3-- <= 0 && day3 <= cou3 ? day3 < 10 ? " 0" + day3++ : " " + day3++ : "   ");
                if (i % 7 == 0)     //每行中月份之间的两个空格
                    System.out.print("  ");
            }
            System.out.println("  ");   //换行
        }       
    }

}

总结:
此次编码,相对较易,主要是对上述的两个技术要点的理解及算法实现;本代码感觉上太过繁琐,重复太多不必要的步骤,但自己暂未想到如何简化,期待大家提供更多好的思路和想法