今天突发奇想,写一个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月 ------- -------------------------------------------------- 周7 周1 周2 周3 周4 周5 周6 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月 ------- -------------------------------------------------- 周7 周1 周2 周3 周4 周5 周6 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月 ------- -------------------------------------------------- 周7 周1 周2 周3 周4 周5 周6 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月 ------- -------------------------------------------------- 周7 周1 周2 周3 周4 周5 周6 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月 ------- -------------------------------------------------- 周7 周1 周2 周3 周4 周5 周6 *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月 ------- -------------------------------------------------- 周7 周1 周2 周3 周4 周5 周6 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月 ------- -------------------------------------------------- 周7 周1 周2 周3 周4 周5 周6 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月 ------- -------------------------------------------------- 周7 周1 周2 周3 周4 周5 周6 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月 ------- -------------------------------------------------- 周7 周1 周2 周3 周4 周5 周6 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月 ------- -------------------------------------------------- 周7 周1 周2 周3 周4 周5 周6 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月 ------- -------------------------------------------------- 周7 周1 周2 周3 周4 周5 周6 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月 ------- -------------------------------------------------- 周7 周1 周2 周3 周4 周5 周6 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