Java语言程序设计(第十版基础篇):printCalendar

注:默认从1800年1月1日星期三开始,要求用户输入年份和月份,自动生成对应的日历。
对应的代码如下:


package cn.edu.xyniu;

import java.util.Scanner;

public class PrintCalendar {
    public static void main(String[] args) {
        //01-1用户输入年月并打印
        Scanner input = new Scanner(System.in);
        System.out.println("Enter year(eg:2018)");
        int year = input.nextInt();
        System.out.println("Enter month(eg:12)");
        int month = input.nextInt();
        printMonth(year,month);

    }

    public static void printMonth(int year,int month) {
        printMonthTitle(year,month);
        printMonthBody(year,month);
    }

    public static void printMonthTitle(int year,int month) {

        System.out.println("         "+GetMonthName(month)+" "+year);
        System.out.println("-----------------------------");
        System.out.printf("%4s%4s%4s%4s%4s%4s%4s\n","Sun","Mon","Tus","Wed","Thu","Fri","Sat");
    }

    //01-2月份转换
    public static String GetMonthName(int m) {
        String monthName = "";
        switch(m) {
            case 1:monthName = "Jannuary";break;
            case 2:monthName = "February";break;
            case 3:monthName = "March";break;
            case 4:monthName = "April";break;
            case 5:monthName = "May";break;
            case 6:monthName = "June";break;
            case 7:monthName = "July";break;
            case 8:monthName = "August";break;
            case 9:monthName = "September";break;
            case 10:monthName = "October";break;
            case 11:monthName = "November";break;
            case 12:monthName = "December";break;
        }
        return monthName;       
    }

    /** Print month body */
    public static void printMonthBody(int year, int month) {
        // Get start day of the week for the first date in the month
        int startDay = getStartDay(year, month);

        // Get number of days in the month
        int numberOfDaysInMonth = getNumberOfDaysInMonth(year, month);

        // Pad space before the first day of the month
        for (int i = 0; i < startDay; i++)
          System.out.print("    ");

        for (int i = 1; i <= numberOfDaysInMonth; i++) {
          System.out.printf("%4d", i);

          if ((i + startDay) % 7 == 0)
            System.out.println();
        }

        System.out.println();
     }

     /** Get the start day of month/1/year */
     public static int getStartDay(int year, int month) {
        final int START_DAY_FOR_JAN_1_1800 = 3;
        // Get total number of days from 1/1/1800 to month/1/year
        int totalNumberOfDays = getTotalNumberOfDays(year, month);

        // Return the start day for month/1/year
        return (totalNumberOfDays + START_DAY_FOR_JAN_1_1800) % 7;
     }

     /** Get the total number of days since January 1, 1800 */
     public static int getTotalNumberOfDays(int year, int month) {
        int total = 0;

        // Get the total days from 1800 to year
        for (int i = 1800; i < year; i++)//2018   不包含当年2018!
          if (isLeapYear(i))
            total = total + 366;
          else
            total = total + 365;

        // Add days from Jan to the month prior to the calendar month
        for (int i = 1; i < month; i++)//2  不包含2月
          total = total + getNumberOfDaysInMonth(year, i);

        return total;
     }

     /** Get the number of days in a month */
     public static int getNumberOfDaysInMonth(int year, int month) {
        if (month == 1 || month == 3 || month == 5 || month == 7 ||
          month == 8 || month == 10 || month == 12)
          return 31;

        if (month == 4 || month == 6 || month == 9 || month == 11)
          return 30;

        if (month == 2) return isLeapYear(year) ? 29 : 28;

        return 0; // If month is incorrect
     }

     /** Determine if it is a leap year */
     public static boolean isLeapYear(int year) {
        return year % 400 == 0 || (year % 4 == 0 && year % 100 != 0);
     }  


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值