在这里分二个类来完成日历
1、建一个方法类 MyCalander 类
2、建一个运行类 Demo 来完成方法调用连接一起 需要 main 方法
方法类:MyCalander
/*处理日历计算的类
** 属性 参考点 起始年份 -- 1900 1号 是星期一
* 画出日历需要哪些条件:
* 1 要知道是 平年 是 闰年 (返回年天数)
* 2 什么年的 2月份 多少天(返回月的天数)
* 3 跟据平年 闰年-- 算出起始年份到要查询年份的前一年天数 (返回起始年到查询年 的总天数)
* 4 跟据 什么年的2月份-- 算出1月到要查询月的前一月总天数 (返回 1月到查询月的 总天数)
* 注意:算出起始到查询的天 只能是前一个月或前一年的天数, 因为查询的本月本年都没过完不能算 * 入!!!
* 5 跟据 年的总天数 加 月的总天数 再对7取余 == 算出1号星期几 (返回 星期几)
* 知道上面的了 就可以开始画日历了
* 1 建一个数组存 要显示的星期
* 2 建一个数组存 要显示的这个月
* 3 循环打印出星期
* 4 循环初始化这个月的数组
* 5 跟据一号星期几
* */
方法一 到 方法五 都是有参数有返回值的方法 提高代码的复用性
第一个方法 什么年
/**
* 功能:是平年?是闰年?
* @param pyear 参数年
* @return 返回天数
*/
static int daysOfYear(int pyear){
//可以被四整除的非整百年份,还有 可以被400整除的年份
if((pyear % 4==0 && pyear%100!=0) || pyear %400 == 0){
return 366;
}else {
return 365;
}
}
第二个方法: 根据第一个方法 得到每个月的天数
//判断每个月的天数
int getDaysOfMonth(int pyear,int pmonth){
if(pmonth == 2){
//二月天数,先判断是否闰年
if(getDaysOfYear(pyear) == 366){
return 29;
}else {
return 28;
}
}else if (pmonth == 4 || pmonth == 6 || pmonth == 9 || pmonth == 11) {
//小月天数
return 30;
}else {
//大月天数
return 31;
}
}
第三个方法: 根据第一个方法 计算起始年1900年到查询年的前一年的天数
//计算起始年1900年到查询年的前一年的天数
int getPassOfYear(int pyear){
int sum = 0;
for(int index = 1900;index < pyear;index++){
sum += getDaysOfYear(index);
}
return sum;
}
第四个方法: 根椐第二个方法计算1月到查询月的前一月的天数
//计算1月到查询月的前一月的总天数
int getPassOfMonth(int pyear,int pmonth){
int sum = 0;
for(int index = 1;index < pmonth;index ++){
sum += getDaysOfMonth(pyear, index);
}
return sum;
}
第五个方法: 根据第三个、第四个方法算出1号是星期几
//计算 1号 星期几
int getNo1OfShowMonth(int pyear,int pmonth){
//如果用户输入2016,5月 算出1900年一月一号 到2016的4月的总天数
int week = (getPassOfYear(pyear) + getPassOfMonth(pyear, pmonth) ) % 7;
return week;
}
第六个方法:调用系统的日期 二个方法写一起了
//调用系统日期年的方法
int callSystemDateYear(int pyear){
Calendar c = Calendar.getInstance();//可以对每个时间域单独修改
pyear = c.get(Calendar.YEAR);
return pyear;
}
//调用系统日期月的方法
int callSystemDateMonth(int pmonth){
Calendar c = Calendar.getInstance();//可以对每个时间域单独修改
pmonth = c.get(Calendar.MONTH) + 1;
return pmonth;
}
第七个方法:开始做日历的头部
//打印日历头部
void printCalander(int pyear,int pmonth){
System.out.println("\t\t 欢迎使用本人制做的日历");
System.out.println("----------------------------------------------------");
System.out.print("\t");
System.out.print(getDaysOfYear(pyear)==366?"闰年":"平年");
System.out.println("\t\t"+pyear+" 年\t\t"+pmonth+" 月");
System.out.println("----------------------------------------------------");
String[] weekShow = {"星期日\t","星期一\t","星期二\t","星期三\t","星期四\t","星期五\t","星期六\t"};
//显示星期
for (int i = 0; i < weekShow.length; i++) {
System.out.print(weekShow[i]);
}
}
//打印日期的天数
void drawCalander(int pyear,int pmonth){
String[] monthDayShow = new String[37];
//初始化一个月的数组
for (int i = 0; i < monthDayShow.length; i++) {
monthDayShow[i] = "";
}
//把用户输入的月的天数填充到数组,并按照一号是星期几填充
for (int i = 1; i <= getDaysOfMonth(pyear, pmonth) ; i++) {
if (getNo1OfShowMonth(pyear,pmonth)==6) {
monthDayShow[i-1]=(i)+"";
}else {
monthDayShow[getNo1OfShowMonth(pyear, pmonth)+i]=(i)+"";
}
}
//显示天数
for (int i = 1; i < monthDayShow.length; i++) {
if (i%7==1) {
System.out.println();
}
System.out.print(monthDayShow[i-1]+"\t");
}
System.out.println();
}
方法类:Demo
import java.util.Scanner;
public class Demo {
public static void main(String[] args) {
Scanner mScanner = new Scanner(System.in);
int userChoice = 0; //用户选择
boolean isContinue = true; //循环控制条件
//当前的年份还有月份
int year = 0; //年
int month = 0; //月
MyCalander mCalander = new MyCalander();
year = mCalander.callSystemDateYear(year);
month = mCalander.callSystemDateMonth(month);
a:do {
mCalander.printCalander(year, month);
mCalander.drawCalander(year, month);
System.out.println("1 上一月 2 下一月 3 上一年 4 下一年 5其它退出");
while (!mScanner.hasNextInt()) {
System.err.println("请输入整数:");
mScanner.next();
}
userChoice = mScanner.nextInt();
if (userChoice>=5||userChoice<=0) {
break a;
}
switch (userChoice) {
case 1:
month --;
//本年一月份 再上个月 就是上一年的12月
if(month == 0){
month = 12;
year--;
}
break;
case 2:
month ++;
//在本年的12月 再查看下一月,就到了下一年的一月份
if(month == 13){
month = 1;
year++;
}
break;
case 3:
year--;
break;
case 4:
year++;
break;
}
} while (isContinue);
System.out.println("感谢使用");
mScanner.close();
}
}