java用类封装的方式写简单的日历

来源:互联网 发布:云计算优缺点 编辑:程序博客网 时间:2024/04/28 05:49

/*程序 1 给定某一年某一天如(1900年一月一日)
* 2计算输入的改天离1900年一月一日相差多少天;
* ①计算输入的那一年到1900有天 润年366 平年365;
* ②计算输入的那一个月到输入的那一年有几天 分四种情况 一个月的天数有31 31 28 29 这四种情况
* ③再加上输入的那一日减去1就是离1900年一月一日
* 3计算那天是周几 对7取模除尽为星期一(如果加1 在对7取模是算的是第1900年1月1号前一天也就是星期日取模)
*
* */

public class Calender {
//起始年份,一月一号是星期几
static int originYear = 1900;
static int firstInWeek = 1;
//一 二 三 四 五 六 七 八 九 十 十一 十二
static int[] daysOfMonthArr ={31,28,31,30,31,30,31,31,30,31,30,31};

//某一年的天数static int daysOfYear(int pyear){        //可以被四整除的非整百年份                                                                   可以被400整除的年份    if ((pyear % 4== 0 && pyear%100 !=0) || pyear % 400 == 0) {        return 366;    }else {        return 365;    }}//某一个月的天数  参数为我们想求的哪一个月static int daysOfMonth(int pmonth,int pyear){    //判断该年是否为润年 润年额二月为29天 平年28    if (daysOfYear(pyear) ==366) {        daysOfMonthArr[1] = 29;    }else{        daysOfMonthArr[1] = 28;    }    //返回用户需要查询的月份(参数传递进来的pmonth)    return daysOfMonthArr[pmonth-1];}//画出日历 不需要返回值static void drawCalander(int pfirstInWeek ,int  pdayOfmonth){    String[] arr = new String[42];    System.out.println("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六");    //将数组初始化为空     for (int i = 0; i < arr.length; i++) {        arr[i] = "";    }    //根据一号是星期几 从一号开始填充直到这个月的天数    for (int j = 0; j < pdayOfmonth; j++) {                              //字符串拼接成为字符串        arr[pfirstInWeek +j] = j + 1+"";    }    //画日历    for (int i = 0; i < arr.length; i++) {        //七天换一行        if(i % 7 ==0 && i !=0){            System.out.println();        }        //从日历第一个格开始画,直到42,画满整个日历        System.out.print(arr[i]+"\t");    }    System.out.println("\n-------------------------------------");}//得到2010年到用户输入年份呢的天数

static int getDaysPassOfYear(int pyear){
int sum= 0;//总天数
//循环算出 从2010年开始算
for (int i = originYear; i < pyear; i++) {
//把天数累计到sum中
sum +=daysOfYear(i);
}
//把计算的天数返回
return sum;
}

//获取一月到4月份的天数 假如输入5月static int getDaysPassOfMonth(int pyear,int pmonth){    int sum =0;    //循环累加    for (int i = 1; i < pmonth; i++) {        //累加从一月份开始        sum += daysOfMonth(i, pyear);    }    //把总天数返回    return sum;}//得到要显示的月份的一号是星期几static  int getWeek(int pmonth ,int pyear){    int  week=0;//要返回的星期几    //假设输入的是2015年5月 计算的是2010,2011,2012,2013,2014年还有2015年的1~4月份    week = (getDaysPassOfMonth(pyear, pmonth)+getDaysPassOfYear(pyear)+firstInWeek)%7;    return week;}//展示 日历,用户需要给出哪一年 哪一月static void  showCalander(int pyear,int pmonth){    //getWeek(pmonth, pyear)算出1号星期几,返回int    //daysOfMonth(pmonth, pyear)算出这个月有多少天,返回int    drawCalander(getWeek(pmonth, pyear), daysOfMonth(pmonth, pyear));}

}

这个类封装几个方法 算出距离1900年一月一日到输入那一年的那一月的1号的天数和星期几

import java.util.Scanner;

public class MyInput {

static Scanner mScanner = new Scanner(System.in);static int nextInt(){    while (!mScanner.hasNextInt()) {        System.err.println("请输入一个整数");        mScanner.next();    }    int data = mScanner.nextInt();    return data;//或return mScanner.nextInt()}static float nextFloat(){    while (!mScanner.hasNextFloat()) {        System.err.println("请输入一个小数");;        mScanner.next();    }    return mScanner.nextFloat();}static double nextDouble(){    while (!mScanner.hasNextDouble()) {        System.err.println("请输入double型的数");        mScanner.next();    }    return mScanner.nextDouble();}static boolean nextBoolean(){    while (!mScanner.hasNextBoolean()) {        System.err.println("请输入boolean类型");        mScanner.next();    }    return mScanner.nextBoolean();}static String next(){    return mScanner.next();}

}

这是一个过滤的封装类

import java.util.Calendar;

public class Demo {
public static void main(String[] args) {
String userChoice =”“;

    //获取系统时间    Calendar mCalendar = Calendar.getInstance();    int year = mCalendar.get(Calendar.YEAR);    //获取系统的时间 比实际时间少了一个月    int month = mCalendar.get(Calendar.MONTH)+1;    do {        Calender.showCalander(year, month);        System.out.println("请输入 1 上个月 2 下个月 3 上一年 4 下一年 5 指定日期 6 退出");        userChoice = MyInput.next();        switch (userChoice) {        case "1":            if (year >= Calender.originYear) {                month--;                //当到达边界的时候一月份的时候    月份回到上一年的12月,                if (month == 0) {                    month = 12;                    year--;                }            }else {                System.err.println("不支持1900年以前的日历");            }            break;        case "2":            month++;            if (month ==13) {                month =1;                year++;            }            break;        case "3":            year--;            break;        case "4":            year++;            break;        case "5":            //输入的年份不能低于1900            do{                System.out.println("请输入要查询的年份:大于1900");                year = MyInput.nextInt();            }while(year < 1900);            //输入的月份在1月到12月之间            do{                System.out.println("请输入要查询的月份   1 - 12");                month = MyInput.nextInt();            }while(month < 1 || month > 12);            break;        case "6":            break;        default:            break;        }    } while (!userChoice.equals(6));    System.out.println("感谢使用abandon日历 ");}

}

0 0