Java输出某一年的日历(可改成输出某年某月的日历)

这篇博客展示了如何使用Java编写程序来打印任意一年的日历。通过计算从2019年1月1日到指定日期的天数,确定每个月的第一天是星期几,进而输出完整的日历。程序包括了输出日历标题和主体的函数,以及判断闰年和获取每月天数的辅助方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里给大家展示一下如何用Java写一个输出某一年日历的程序。水平有限,如果有更简单的方法,不妨在评论区分享!


一年的日历,是由每一个月的小日历组成的。一个月的日历分为日历头(2020年-1月)和日历体。

要打印一年的日历,只需输出某一年中1到12月的小日历。

输出日历头

    public static void printMonthTitle(int year,int month) {
        
        System.out.printf("\n%13s-%-13d\n",getMonthsName(month),year); //getMonthsName方法用于得到对应月份的名字,如1月为Jan,6月为Jun
        for(int i=1;i<=27;i++) System.out.print("=");
        System.out.println("\nMon Tue Wed Thu Fri Sat Sun"); // 该日历以星期一开始
        
    }

输出日历体

    public static void printMonthBody(int year,int month) {
        
        int count=0;
        int day=firstDayOfMonth(year,month); //算出月份第一天是星期几
        int totalDaysOfMonth=getTotalDaysOfMonth(year,month); //一个月一共多少天
        for(int i=1;i<day;i++) {
            System.out.print("    ");
            count++;
        }
        for(int i=1;i<=totalDaysOfMonth;i++) {
            if(count==7) {
                System.out.printf("\n");
                count=0;
            }
            System.out.printf("%-4d",i);
            count++;
        }
    }

整个程序的实现的难点在于每个月份开始的第一天对应是星期几是变化的。一个星期是7天,那么星期的变化周期就是7。我们在这里需要找一天进行参照,为了计算的方便,我们一般找某一年的第一天,如2019年1月1号,星期二。要知道某一年某月的第一天是星期几,我们只需要计算某年某月第一天跟2019年1月1号距离多少天,后运用星期变化周期为7天的性质,便可以计算出来了。

代码实现:

public static int firstDayOfMonth(int year,int month) {
        int daysFrom2019_1_1=0;
        int day=2;//Tuesday
        if(year>=2019) {
            for(int y=2019;y<year;y++) {
                if(isLeapYear(y)) {
                    daysFrom2019_1_1=daysFrom2019_1_1+366;
                }
                else {
                    daysFrom2019_1_1=daysFrom2019_1_1+365;
                }
            }
            for(int i=1;i<month;i++) {
                daysFrom2019_1_1=daysFrom2019_1_1+getTotalDaysOfMonth(year,i);
            }
        }
        else {
            for(int y=year+1;y<2019;y++) {
                if(isLeapYear(y)) {
                    daysFrom2019_1_1=daysFrom2019_1_1+366;
                }
                else {
                    daysFrom2019_1_1=daysFrom2019_1_1+365;
                }
            }
            for(int i=12;i>=month;i--) {
                daysFrom2019_1_1=daysFrom2019_1_1+getTotalDaysOfMonth(year,i);
            }
        }
        if(year>=2019) {
            day=((daysFrom2019_1_1%7)+day)%7;
        }
        else {
            day = (day-(daysFrom2019_1_1%7)+7)%7;
        }
        if(day==0) day=7; // 
        return day;
    }

代码中day代表星期几,取值范围是1~7,如2019年1月1号为星期二,那么day=2. 

完整代码:

import java.util.*;
public class Calender{
    
    public static void main(String args[]) {
        Scanner in=new Scanner(System.in);
        System.out.print("Enter the year:");
        int year=in.nextInt();
        in.close();
        for(int i=1;i<=12;i++) {
            
            printMonthTitle(year,i);
            
            printMonthBody(year,i);
            
        }
        
    }
    
    public static String getMonthsName(int month) {
        String monthsName="Jan";
        switch(month) {
        case 1:monthsName="Jan";break;
        case 2:monthsName="Feb";break;
        case 3:monthsName="Mar";break;
        case 4:monthsName="Apir";break;
        case 5:monthsName="May";break;
        case 6:monthsName="Jun";break;
        case 7:monthsName="Jul";break;
        case 8:monthsName="Aug";break;
        case 9:monthsName="Sep";break;
        case 10:monthsName="Oct";break;
        case 11:monthsName="Nov";break;
        case 12:monthsName="Dec";break;
        }
        return monthsName;
    }
    public static int getTotalDaysOfMonth(int year,int month) {
        switch(month) {
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:return 31;
        case 2:{
            if(isLeapYear(year))
                return 29;
            else 
                return 28;
        }
        default: return 30;
        }
    }
    
    public static int firstDayOfMonth(int year,int month) {
        int daysFrom2019_1_1=0;
        int day=2;//Tuesday
        if(year>=2019) {
            for(int y=2019;y<year;y++) {
                if(isLeapYear(y)) {
                    daysFrom2019_1_1=daysFrom2019_1_1+366;
                }
                else {
                    daysFrom2019_1_1=daysFrom2019_1_1+365;
                }
            }
            for(int i=1;i<month;i++) {
                daysFrom2019_1_1=daysFrom2019_1_1+getTotalDaysOfMonth(year,i);
            }
        }
        else {
            for(int y=year+1;y<2019;y++) {
                if(isLeapYear(y)) {
                    daysFrom2019_1_1=daysFrom2019_1_1+366;
                }
                else {
                    daysFrom2019_1_1=daysFrom2019_1_1+365;
                }
            }
            for(int i=12;i>=month;i--) {
                daysFrom2019_1_1=daysFrom2019_1_1+getTotalDaysOfMonth(year,i);
            }
        }
        if(year>=2019) {
            day=((daysFrom2019_1_1%7)+day)%7;
        }
        else {
            day = (day-(daysFrom2019_1_1%7)+7)%7;
        }
        if(day==0) day=7;
        return day;
    }
    
    public static void printMonthTitle(int year,int month) {
        
        System.out.printf("\n%13s-%-13d\n",getMonthsName(month),year);
        for(int i=1;i<=27;i++) System.out.print("=");
        System.out.println("\nMon Tue Wed Thu Fri Sat Sun");
        
    }
    
    public static void printMonthBody(int year,int month) {
        
        int count=0;
        int day=firstDayOfMonth(year,month);
        int totalDaysOfMonth=getTotalDaysOfMonth(year,month);
        for(int i=1;i<day;i++) {
            System.out.print("    ");
            count++;
        }
        for(int i=1;i<=totalDaysOfMonth;i++) {
            if(count==7) {
                System.out.printf("\n");
                count=0;
            }
            System.out.printf("%-4d",i);
            count++;
        }
    }
    
    public static boolean isLeapYear(int year) {
        if(( year%4==0&&year%100!=0 )||(year%400==0))
            return true;
        else
            return false;
    }
}
 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值