java 动态日历的实现
动态日历
动态日历要求打印指定年份和指定月份的日历展示界面,可显示星期与日期信息。动态日历集合了java众多基础语法,包括数据类型、条件分支、循环语句、运算符、面向对象 、类、对象、属性、方法、封装的基础知识,所以动态日历的掌握对java入门有很大帮助。
分析
实现日历的基本思想为:确定一个基准日期,计算从基准日期到指定年份月份的前一个月的总天数,计算这个总天数的前提为判断指定年份是否是闰年(闰年是可以被400整除或者可以被4整除但不被100整除的年份),利用总天数除以7的余数可以确定当前月份前面的空格数,要想简单的使此余数为空格数,则基准日期必须为1月1日并且是星期一,大部分日历的基准日期为1900年1月1日,并且这一天是星期一,可以更简单实现动态日历。
步骤分析
- 判断指定年份是否是闰年
- 计算从1900年1月到目标年份月份的前一个月总天数
- 根据提供的月份获取当月总天数
- 获取打印当前月信息时要输出的空格数
- 打印日历
代码
MyCalender类
/**
* java基础语法 数据类型、条件分支、循环语句、运算符 面向对象 类、对象、属性、方法、封装 分析:
* 1.判断指定年份是否是闰年
* 2.计算从1900年1月到目标年份月份的前一个月总天数
* 3.根据提供的月份获取当月总天数
* 4.获取打印当前月信息时要输出的空格数
* 5.打印日历
* @author max
*
*/
public class MyCalender {
private int year;// 2019
private int month;// 7
/** 构造器,初始化目标年份,月份 */
public MyCalender(int y, int m) {
year = y;
month = m;
}
/** 判断指定年份是否是闰年 */
public boolean isLeapYear(int y) {
if (y % 400 == 0 || (y % 4 == 0 && y % 100 != 0)) {
return true;
}
return false;
}
/** 计算从1900年1月到目标年份,月份前一个月的总天数 */
public int getTotalDaysFrom1900() {
int days = 0;
// 计算整年的总天数
for (int i = 1900; i < year; i++) {
days += isLeapYear(i) ? 366 : 365;
}
// 计算整月的总天数
for (int i = 1; i < month; i++) {
days += getDayOfMonth(i);
}
return days;
}
/** 根据提供的月份获取当月的总天数 */
public int getDayOfMonth(int i) {
switch (i) {
case 4:
case 6:
case 9:
case 11:
return 30;
case 2:
return isLeapYear(year) ? 29 : 28;
default:
return 31;
}
}
/** 打印日历 */
public void print() {
//获取打印当前月信息时要输出的空格数
int spaces = getTotalDaysFrom1900()%7;
//获取当前月份的总天数
int days = getDayOfMonth(month);
//打印输出
System.out.println("\t\t 动态日历");
System.out.println("\t\t 【"+year+"】年【"+month+"】月");
System.out.println("==================================================");
System.out.println("一\t二\t三\t四\t五\t六\t日");
System.out.println("==================================================");
//初始化计数器,同时是否到达7的倍数
int count =0;
for(int i = 0;i <spaces ;i++) {
System.out.print("\t");
count++;
}
//输出日期
for(int i = 1;i <= days;i++) {
System.out.print(i+"\t");
count ++;
if(count % 7 == 0) {
System.out.println();
}
}
}
}
TestCalender类
public class TestCalender {
public static void main(String[] args) {
MyCalender mc = new MyCalender(2019,6);
int days = mc.getTotalDaysFrom1900();
mc.print();
}
}
以2019年6月测试
以下是运行结果