JAVA 80行代码 写一个 万年历

简介: 今天突发奇想,写一个1899年12月31日到2021年的万年历(花了我半小时)/**我是小白*///欢迎大佬来点评//我想问各位大佬57-83行的日期输出怎末优化,有没有神魔好的建议

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


目录
相关文章
|
3月前
|
Java Android开发
万年历【小游戏】(Java课设)
万年历【小游戏】(Java课设)
32 2
|
11天前
|
Java
05 Java代码实现一个小游戏(剪刀石头布)和一个简易的万年历
05 Java代码实现一个小游戏(剪刀石头布)和一个简易的万年历
21 2
|
3月前
|
Java Android开发
日历/万年历【小游戏】(Java课设)
日历/万年历【小游戏】(Java课设)
35 1
日历/万年历【小游戏】(Java课设)
|
安全 固态存储 Java
基于Java的万年历(课设)
Java编程语言自诞生十几年来,已经成功地运用在网络计算及移动等各个领域。对于开发者来说,它具有简单、面向对象、健壮、安全、结构中立、可移植和高效能等众多优点。此次我们用JAVA来设计一个万年历程序,该程序以网页形式运行,并且支持图形化界面,能以日历的形式显示日期与星期,用户能自己输入日期,支持查找日期,并且能够更新日期,是一个简单易用的小应用。
252 1
使用JAVA完成万年历
使用JAVA完成万年历
201 0
Java基础用Date类编写万年历
Java基础用Date类编写万年历
|
自然语言处理 算法 Java
【Java作业】万年历
【Java作业】万年历
【Java作业】万年历
|
Java
使用 java 基础语言实现万年历
已知(只有一个已知条件): 1900年1月1号是星期一 实现的功能: 通过本条件来写一个输入相应的年份和月份就可以在控制台输出相应月份月历 基本的思路: 已知1900年的1月1日是周一,要输出这个月的月历首先最需要知道的就是本月1号是周几,这样我们才可以排列出来这个月的月历第一天的位置 ...
1556 0
|
6天前
|
安全 Java 数据库
一天十道Java面试题----第四天(线程池复用的原理------>spring事务的实现方式原理以及隔离级别)
这篇文章是关于Java面试题的笔记,涵盖了线程池复用原理、Spring框架基础、AOP和IOC概念、Bean生命周期和作用域、单例Bean的线程安全性、Spring中使用的设计模式、以及Spring事务的实现方式和隔离级别等知识点。