这里给大家展示一下如何用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;
}
}