0
点赞
收藏
分享

微信扫一扫

JAVA 80行代码 写一个 万年历


今天突发奇想,写一个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


举报

相关推荐

0 条评论