java日历

使用java.util.Calendar类实现一个简单的日历显示:

public class MyCalendar {
    public static void main(String[] args) throws IOException {
        Calendar c = Calendar.getInstance();
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        System.out.println("请输入年-月-日:");
        String[] date = br.readLine().split("-");

        // 设置年月日
        try {
            c.set(Calendar.YEAR, Integer.parseInt(date[0]));
            // 月份要减去1
            c.set(Calendar.MONTH, Integer.parseInt(date[1]) - 1);
            c.set(Calendar.DATE, Integer.parseInt(date[2]));
        }catch (NumberFormatException nfe){ // 用户的输入可能有问题
            System.out.println("您的输入有误,系统将输出今天日期");
        }
        br.close();
        int day = 1; // 日期从1号开始
        int week = 1; // 每周从星期1开始;
        // 获取这个月1号是星期几
        int monthFirstWeek = getMonthOneWeek(c.get(Calendar.WEEK_OF_MONTH), c.get(Calendar.DAY_OF_WEEK), c.get(Calendar.DAY_OF_MONTH));
        // 上个月最大的日期
        int beforeMonthDay = getMonthMax(c.get(Calendar.YEAR), c.get(Calendar.MONTH));
        // 第一周开始的日期            这个月1号要占用一个位置,开始的日期要占用一个位置,所以-2
        int startWeek = beforeMonthDay - (monthFirstWeek - 2);


        System.out.println(c.get(Calendar.YEAR) + "年" + (c.get(Calendar.MONTH) + 1) + "月");
        System.out.println("一\t二\t三\t四\t五\t六\t日");

        for (int i = 1; i < monthFirstWeek; i++) { // 打印上个月遗留下的日期
            System.out.print(startWeek++ + "\t");
            week++;
        }

        while (day <= getMonthMax(c.get(Calendar.YEAR), c.get(Calendar.MONTH) + 1)) { // 不超过最大日期
            if (week > 7) {
                week = 1; // 重置星期并换行
                System.out.println();
            }
            if (day == c.get(Calendar.DATE)) { // 是今天就要加*号
                System.out.print(day + "*\t");
            } else {
                System.out.print(day + "\t");
            }
            week++;
            day++;
        }
        day = 1;
        while (week++ <= 7) { // 这个月最后一周要用下个月的日期补满
            System.out.print(day + "\t");
            day++;
        }

    }

    /**
     * @param Week_Of_Month:今天在第几周
     * @param Day_Of_Week:今天是周几
     * @param Day_Of_Month:今天是几号
     * @return return 这个月1号是星期几
     */
    public static int getMonthOneWeek(int Week_Of_Month, int Day_Of_Week, int Day_Of_Month) {
        // 控制每周从星期1开始还是星期2
        if (Day_Of_Week == 1) {
            Day_Of_Week = 7;
            Week_Of_Month -= 1; // 国内星期日是在上一周的末尾
        } else {
            Day_Of_Week -= 1;
        }

        int Month_First_Day = Day_Of_Week;  // 这个月1号是从第几周开始
        // 算出这个月的第一周,Day_Of_Week星期是几号
        // 这个月第一周星期Day_Of_Week = 今天的日期 - (7*(今天是这个月的第几周-1))
        int firstWeekDay = Day_Of_Month - (7 * (Week_Of_Month - 1));

        if (firstWeekDay > 0) { // 大于0就说明这个日期是在这个月的
            for (int i = firstWeekDay; i > 1; i--) {
                Month_First_Day--;
            }
        } else { // 小于0 就说明是上个月的日期
            for (int i = firstWeekDay; i < 1; i++) {
                Month_First_Day++;
            }
        }
        return Month_First_Day;
    }

    /**
     * @param Month: 月份
     * @param year:  年份
     * @return 月份最大日期
     */
    public static int getMonthMax(int year, int Month) {
        if (Month == 2) {
            if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
                return 29;
            } else {
                return 28;
            }
        } else if (Month == 4 || Month == 6 || Month == 9 || Month == 11) {
            return 30;
        }
        return 31;
    }

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值