你没有见过的JAVA动态日历(船新版本)

Author:天添豆浆
计算机科学与技术专业,迷摇滚的理科男
新手村码农,第一篇博客,记录成长

老标题党了…基础语法不值一提,重在记录学习过程。

前言:

  • 显示方法和视觉排版跟以前的动态日历一样,都是在控制台打印输出。
  • 以前没有学习Calendar类及其常用方法,是自定义方法,从底层算法逻辑判断平闰年、月份天数。本题核心内容:“本月第一天是星期几?”的实现逻辑也大不相同。
  • 但是最终排版打印显示界面的代码逻辑相同。
话不多说看看代码:
import java.util.Calendar;
/**
 * 	动态日历(船新版本)
 * 	要求:
 * 		使用Calendar类完成一个动态日历(就在控制台打印输出,不涉及窗口JFrame),
 * 		要求提供年份、月份,显示当月的日历布局。
 * 	实现动态日历有两个问题:
 * 		1、当月有 多少天?
 * 		2、本月第一天是星期几?
 * 	提示:
 * 		Calendar类
 * 
 * @author 天添豆浆
 *
 */
public class MyCalendar {

	private int year;
	private int month;
	
	public MyCalendar(int year, int month) {
		this.year = year;
		this.month = month;
	}
	
	public void showCalendar() {
		//获取日历的实例对象,getInstance()将返回一个Calendar的对象
		Calendar c = Calendar.getInstance();
		c.set(Calendar.YEAR, year);
		c.set(Calendar.MONTH, month -1);
		//将日期设置为当月的第1天
		c.set(Calendar.DAY_OF_MONTH, 1);
		//获取当天(1号)是此月周几!!!!!!
		int weekDay = c.get(Calendar.DAY_OF_WEEK) - 1;
//		System.out.println(weekDay);
		//经测试,2020年3月日历有bug,特殊情况特殊处理
		if(weekDay == 0) {
			weekDay = 7;
		}
		//获取当月具备的最大值(当月总天数)!!!!!!
		int days = c.getActualMaximum(Calendar.DAY_OF_MONTH);
//		System.out.println(days);
		
		//制作控制台打印的界面布局
		System.out.println("==================【船新版本动态日历】==================");
		System.out.println("--------------------【"+ year + "年" + month + "月" + "】-------------------");
		System.out.println("一\t二\t三\t四\t五\t六\t日");
		System.out.println("--------------------------------------------------");
		//声明计数器,统计是否到达7,若到7则需转行(布局需要)
		int count = 0;
		//打印出数\t
		//*只有遍历数组才从0开始循环,因为数组索引是从0开始
		for (int i = 1; i < weekDay; i++) {
			System.out.print("\t");
			//计数器计数
			count ++;
		}
		//打印天数(天数<=days(本月最大天数))
		for (int j = 1; j <= days; j++) {
			System.out.print(j + "\t");
			//计数器计数
			count++;
			/*添加判断:
			 * 	若计数器到7(填满一周),需换行,并且计数器归零,以便下周的日期顺序输出*/
			if(count == 7) {
				System.out.println();
				System.out.println();
				count = 0;
			}
		}
	}
	
	public static void main(String[] args) {
		/*	创建类的对象,传入想查询的年份、月份,
		 * 	调用上述showCalendar()方法*/
		new MyCalendar(2020,7).showCalendar();
	}
}
/**
 * 补充:
 * 	Calendar类是一个抽象类,在实际使用时实现特定的子类的对象。
 * 	由于Calendar类是抽象类,且Calendar类的构造方法是protected的,
 * 	所以无法使用Calendar类的构造方法来创建对象,API中提供了getInstance方法用来创建对象。
 * 	所以定义一个Calendar对象就应该为:Calendar c = Calendar.getInstance();
 */


输出结果(截图):

在这里插入图片描述
在这里插入图片描述

反思:

  • 学习了一些JDK内置类即其常用方法,相比之前,优化了实现过程。
  • 学习的内置方法虽然代码更简单,但其底层的算法逻辑还是得明白。(记得时不时看看以前的代码看看逻辑,也别忘了查看源码、查API)
  • 但这次动态日历还是只用了一个自定义方法,逻辑与可视化布局挤在一起,思维结构比混乱,可以优化的地方还有很多。
  • 下次再尝试加入ScannerJFrame内容,在窗口显示运行。
  • 同一个题目,在学习到新知识的过程中,不断去运用新知识,从而简化实现过程,优化实现效果。

写在最后:

希望写博客是一个好的开始,记录自己的成长、分享自己的心得,也希望以后回首现在的这些技术经历能有心得收获新的感悟。

PS:

某易云上那个码农必备的后摇歌单快把我听睡着了,
还是激流金属鞭鞑金属带劲_(:τ」∠)_

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值