JAVA 80行代码 写一个 万年历

171 阅读7分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

今天突发奇想,写一个1899年12月31日到2021年的万年历(花了我半小时)

/* *我是小白 */

//欢迎大佬来点评 //我想问各位大佬57-83行的日期输出怎末优化,有没有神魔好的建议

package com.Li.ClassDemo3;

public class YearMonthWeekDay {
	public static void main(String[] args) {
		int count = 1; // 表示当前的天数,用来计算是否需要 移到下一周
		int year = 1899; // 起始年份
		byte month = 12; // 起始月份
		byte week = 7; // 起始周
		byte day = 31; // 起始日期
		byte maxDay = 31; // 每月的最大天数
		for (; year <= 2021; year++) { // 循环年份
			for (; month <= 12; month++) { // 循环月份
				System.out.println("\n\n\n-----     " + year + "年                 ----------     " + month+ "月             -------\n--------------------------------------------------");// 月份华丽分隔
				switch (month) { // 判断平闰年--以此 指定 maxDay 本月总天数
				case 1:
				case 3:
				case 5: // switch 的穿透概念
				case 7:
				case 8:
				case 10:
				case 12: // 1 3 5 7 8 10 12 本月31天
					maxDay = 31; // 设定好最大日期
					break;
				case 2:
					if (year % 100 == 0) {
						if (year % 400 == 0) { // 闰 本月29天
							maxDay = 29; // 设定好最大日期
						} else { // 平 本月28天
							maxDay = 28; // 设定好最大日期
						}
					} else if (year % 4 == 0) { // 闰 本月29天
						maxDay = 29; // 设定好最大日期
					} else { // 平 本月28天
						maxDay = 28; // 设定好最大日期
					}
					break;
				case 4: // 2 4 6 9 11 本月30天
				case 6:
				case 9:
				case 11:
					maxDay = 30; // 设定好最大日期
					break;
				} // 判断平闰年结束 maxDay已经重新赋值 下面 的将会 限制 相应 每个月的最大天数
				for (; week <= 7; week++) {
					if (week == 6) { // 如果等于6 说明是本周最后一天 (按照标准日历写法)
						System.out.print("周" + week + "\t\n\n"); // 本周最后一天 所以需要换行 两个换行 是为了 查看清晰
						week = 7; // 换行后 将 周变量 恢复 周日 默认就是周日 第一天 (不接受反驳)
						break; // 跳出
					} else if (week == 7) { // 如果是 7 证明是本周第一天 可以直接输出 但是输出后 需要 手动将 week值 变为需要的值 也就是1 但是在这我不会赋值 1 请往下读
						System.out.print("周" + "日" + "\t"); // 直接输出 后加制表符是为了 每天之间的 间隙(整齐 美观)
						week = 0; // 这里赋值给零 是因为下一天是周一 理应赋值1 但在这个周循环结束的时候 week 变量会自增 1 所以我赋值给0 结束的时候自然而然的就是 week =
									// 1
					} else {
						System.out.print("周" + week + "\t"); // 周 1 2 3 4 5 的情况 直接执行
					}
				} // 周结束循环 nice
				for (; day <= maxDay; day++, count++) { // 日期不可超过MaxDay限定 //当月日期自增 //总天数自增
					if (day == 1) { // 这里考虑到每个月 第一天 不一定就是周日 所以计算 取模7 看应该空出几天的位置 确定1号是周几 后面才不会乱
						switch (count % 7) { // 总天数
						case 1:
							System.out.print(day + "\t"); // 取模余1 但因为1899年最后一天是周日 所以1900年第一天 也就是1号 是 周一 我需要在减去一天
															// 补给1900年的第一个周日 所以正常输出 日期前不用制表符
							break;
						case 2:
							System.out.print("\t" + day + "\t"); // 取模余2 再减去1天 去补位 所以应该空出周日 日期前只需一个制表符
							break;
						case 3:
							System.out.print("\t\t" + day + "\t"); // ....以此类推
							break;
						case 4:
							System.out.print("\t\t\t" + day + "\t"); // ....以此类推
							break;
						case 5:
							System.out.print("\t\t\t\t" + day + "\t"); // ....以此类推
							break;
						case 6:
							System.out.print("\t\t\t\t\t" + day + "\t"); // ....以此类推 承认这是个笨笨笨方法 , 但是逻辑都通
							break;
						case 0:
							System.out.print("\t\t\t\t\t\t*" + day + "\t"); // 虽然取模余0 !但是 再减去1天 去补位 所以是余6 日期前需六个制表符
							break;
						}
					} else {
						System.out.print(day + "\t"); // 假如不是1号直接输出日期 因为已经确定了周几,不会出错
					}
					System.out.print((count % 7 == 0) ? "\n\n" : "");// 三元运算 如果整除7证明一周已满 需要输出换行(两个换行为了控制台清晰) 否之输出一个空
				} // 日期结束循环
				day = 1; // 恢复日期
			} // 月份结束循环
			month = 1; // 恢复月份
		} // 年份结束循环
	}
}

因为内存原因,所以放出来了部分输出




-----     2021年                 ----------     1月             -------
--------------------------------------------------
周7123456	

					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	29	30	

31	


-----     2021年                 ----------     2月             -------
--------------------------------------------------
周7123456	

	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	


-----     2021年                 ----------     3月             -------
--------------------------------------------------
周7123456	

	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	29	30	31	


-----     2021年                 ----------     4月             -------
--------------------------------------------------
周7123456	

				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	29	30	


-----     2021年                 ----------     5月             -------
--------------------------------------------------
周7123456	

						*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	29	

30	31	


-----     2021年                 ----------     6月             -------
--------------------------------------------------
周7123456	

		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	29	30	


-----     2021年                 ----------     7月             -------
--------------------------------------------------
周7123456	

				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	29	30	31	




-----     2021年                 ----------     8月             -------
--------------------------------------------------
周7123456	

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	

29	30	31	


-----     2021年                 ----------     9月             -------
--------------------------------------------------
周7123456	

			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	29	30	


-----     2021年                 ----------     10月             -------
--------------------------------------------------
周7123456	

					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	29	30	

31	


-----     2021年                 ----------     11月             -------
--------------------------------------------------
周7123456	

	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	29	30	


-----     2021年                 ----------     12月             -------
--------------------------------------------------
周7123456	

			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	29	30	31