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