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

/*程序 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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值