java输入年份和月份,实现日历的打印

        解决思路:首先,确定月份的第一天是星期几。其次,确定这个月有多少天,要注意的是闰年和平年的二月天数是不一样的。闰年(1.年数能被4整除,但不能同时被100整除,2.年数能被400整除(二者符合其一就可),例如:1900能被4整除,但他同时能被100整除,所以他不是闰年;2000虽然能被100整除,但它又能被400整除,所以它是闰年。)的二月有29天,平年的二月有28天。


import java.util.Scanner;
public class PrintCalendar{
    public static void main(String[] args){
        Scanner input=new Scanner(System.in);
        System.out.println("Enter a year!");
        int year=input.nextInt();
        System.out.println("Enter a month!");
        int month=input.nextInt();
//打印一个月的日历,如果要打印一年的话,使用循环从第一个月开始就行。
        printMonth(year,month);
//关闭接口,养成好习惯
        input.close();
    }

    public static boolean isLeapYear(int year){ //判断是否为闰年
        return year%4==0&&year%100!=0||year%400==0;
    }

    public static int getDaysInMonth(int year,int month){ //计算每个月有多少天
//大月31天,小月30天,二月根据情况
        switch(month){
            case 1:
            case 3:
            case 5:
            case 7:
            case 8:
            case 10:
            case 12:
                return 31;
            case 2:
                return isLeapYear(year)? 29 : 28;
            default:
                return 30;
        }
    }
    public static String getMonthName(int month){ //获取月份名称,这里采取英文的
    	if(month>12 || month<1) { //非法输入检测
    		System.err.println("错误的月份!");
    		System.exit(0);
    	}
        switch(month){
            case 1:return "January";
            case 2:return "February";
            case 3:return "March";
            case 4:return "April";
            case 5:return "May";
            case 6:return "June";
            case 7:return "July";
            case 8:return "August";
            case 9:return "September";
            case 10:return "October";
            case 11:return "November";
            case 12:return "December";
        }
        return "";
    }
    public static int getStartDay(int year,int month){  //计算每一个月的第一天是星期几
        //选择1900-1-1作为一个时间点,计算从1900-1-1到输入的年月里过多少天
        int daySum=0;
        for(int i=1900;i<year;i++)
            daySum+=isLeapYear(i)? 366: 365;
        for(int i=1;i<month;i++)
            daySum+=getDaysInMonth(year,i);
        //返回星期几,因为选择的1900-1-1是星期一,所以加一。不同的选择有不同的返回值。
        return daySum%7+1;
    }
    public static void printMonth(int year,int month){ //打印日历
        int count=0; //作为计算器
        System.err.println("\t"+getMonthName(month)+"\t"+year);
        System.out.println("---------------------------------------------");
        System.out.println("Sun\tMon\tTue\tWed\tThu\tFri\tSat");
        for(int i=0;i<getStartDay(year,month) && getStartDay(year,month)<7;i++){
            System.out.print("\t");
            count++;
        }
        for(int i=1;i<=getDaysInMonth(year,month);i++){
            System.out.print(i+"\t");
            count++;
            if(count%7 == 0){ //一行只打印七个,包括空格。七次后换行打印。
                System.out.println();
            }
        }
        System.out.println();
        System.out.println("---------------------------------------------");
    }
}

         当然方法不止一种,也可以借用Calendar类来打印日历。

import java.util.Calendar;
import java.util.Scanner;
public class PrintCalendar{
    public static void main(String[] args){
        Scanner input=new Scanner(System.in);
        System.out.println("Enter a year!");
        int year=input.nextInt();
        System.out.println("Enter a month!");
        int month=input.nextInt();
//打印一个月的日历,如果要打印一年的话,使用循环从第一个月开始就行。
        printMonth(year,month);
//关闭接口,养成好习惯
        input.close();
    }
    public static void printMonth(int year,int month){
        printMonthTitle(year,month);
        printMonthBody(year,month);
    }
    public static void printMonthTitle(int year,int month){
        System.err.println("\t"+getMonthName(month)+"\t"+year);
        System.out.println("---------------------------------------------");
        System.out.println("Sun\tMon\tTue\tWed\tThu\tFri\tSat");
    }
    public static String getMonthName(int month){ //获取月份名称,这里采取英文的
    	if(month>12 || month<1) { //非法输入检测
    		System.err.println("错误的月份!");
    		System.exit(0);
    	}
        switch(month){
            case 1:return "January";
            case 2:return "February";
            case 3:return "March";
            case 4:return "April";
            case 5:return "May";
            case 6:return "June";
            case 7:return "July";
            case 8:return "August";
            case 9:return "September";
            case 10:return "October";
            case 11:return "November";
            case 12:return "December";
        }
        return "";
    }
    public static int[] getMonthDays(int year,int month){
        int[] days={0,0};
        Calendar cal=Calendar.getInstance();
        cal.set(Calendar.YEAR,year);
        cal.set(Calendar.YEAR,year);
        cal.set(Calendar.MONTH,month-1);//月份从0开始
        cal.set(Calendar.DAY_OF_MONTH,1);
        days[0]=cal.get(Calendar.DAY_OF_WEEK);
        cal.roll(Calendar.DAY_OF_MONTH,-1);//最后一天
        days[1]=cal.get(Calendar.DAY_OF_MONTH);
        return days;
    }
    public static void printMonthBody(int year,int month){
        Calendar cal=Calendar.getInstance();
        int[] days=getMonthDays(year,month);
        int startDay=days[0]-1;//startDay从1开始,打印要从0开始
        int numberOfDaysInMonth=days[1];
        int i=0;
        for(i=0;i<startDay;i++){
            System.out.printf("\t");
        }
        for(i=1;i<=numberOfDaysInMonth;i++){
            System.out.printf("%d\t",i);
            if((i+startDay)%7==0)
                System.out.println();
        }
        System.out.println("\n---------------------------------------------");
    }
}

如有错误欢迎在评论区指正~

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
实现该功能的一种方法是使用Java中的Calendar类和SimpleDateFormat类。以下是一个示例代码,它可以从键盘输入年份月份,并打印出该月份日历表: ```java import java.util.Calendar; import java.util.Scanner; public class CalendarApp { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("请输入年份: "); int year = scanner.nextInt(); System.out.print("请输入月份: "); int month = scanner.nextInt(); // 创建一个Calendar对象,设置日期为当的第一天 Calendar calendar = Calendar.getInstance(); calendar.set(year, month - 1, 1); // 获取当的天数 int daysInMonth = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); // 获取当第一天是星期几 int firstDayOfWeek = calendar.get(Calendar.DAY_OF_WEEK); // 打印日历表头 System.out.println("日\t一\t二\t三\t四\t五\t六"); // 打印日历表格 int dayOfMonth = 1; for (int i = 1; i <= 6; i++) { for (int j = 1; j <= 7; j++) { if (i == 1 && j < firstDayOfWeek) { System.out.print("\t"); } else if (dayOfMonth > daysInMonth) { break; } else { System.out.print(dayOfMonth + "\t"); dayOfMonth++; } } System.out.println(); } } } ``` 运行程序后,它会要求你输入年份月份输入后,程序会输出该月份日历表。例如,输入2022和3,程序将输出以下内容: ``` 请输入年份: 2022 请输入月份: 3 日 一 二 三 四 五 六 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ``` 注意,该代码只是一种实现方式,还有其他方法可以实现该功能。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值