编程珠玑第三章里有个问题是计算两个给定日子相差的天数;给定某个日期,判断它是星期几,或者说属于一周中的第几天;给定某年某月,打印这个月历
我用JAVA简单实现了一下。
这里有几个关键的问题:要打印这个月历必须知道1、这个月的第一天是星期几;2、这个月共有几天;
对于问题1:可以直接使用JAVA里的Calendar类;我这里使用另外一种方法:已知1800年1月1日是星期3。
设startDay1800 = 3; 则利用startDay = (startDay1800 + getTotalNumberOfDays())%7;即可
求出该月的第一天是星期几;这样关键的问题是求从该月到1800年1月1日总共天数getTotalNumberOfDays();
而要求天数,还有判断某一年是否是闰年。
对于问题2:判断这个月有几天,依据是该年是否是闰年以及时几月份。
直接看下面的程序,
package charpter3;
import javax.swing.JOptionPane;
public class Calender
{
public void printMonth(int year,int month)
{
//year和month是由用户输入传入的
printMonthTitle(year,month);
printMonthBody(year,month);
}
private void printMonthBody(int year, int month)
{
int startDay = getStartDay(year,month);//得到这个月第一天是星期几
int numberDaysInMonth = getTotalNumberDayInMonth(year,month);
for (int i = 0; i < startDay; i++)
{
System.out.print(" ");
}
for (int j = 1; j <= numberDaysInMonth; j++)
{
if (j<10)
{
System.out.print(" " + j);
}else {
System.out.print(" "+ j );
}
if ((j+startDay)%7 == 0)
{
System.out.println();
}
}
}
private int getStartDay(int year, int month)
{
return (getTotalNumberOfDays(year,month) + 3)%7;
}
private int getTotalNumberOfDays(int year, int month)
{
//计算1800年1月1日到该月首日共多少天
int total = 0;
for (int i = 1800; i < year; i++)
{
if(isLeapYear(i)) total+=366;
else total+=365;
}
for (int i = 1; i < month; i++)
{
total = total + getTotalNumberDayInMonth(year,i);
}
return total;
}
private int getTotalNumberDayInMonth(int year, int month)
{
//计算每月的天数
int number = 0;
if (month==1||month==3||month==5||month==7||month==8||month==10||month==12)
{
number = 31;
}
if (month==4||month==6||month==9||month==11) {
number = 30;
}
if(month ==2)
number = isLeapYear(year)?29:28;
return number;
}
private boolean isLeapYear(int year)
{
//判断是否是闰年
return (year%400 == 0)||(year%4 == 0&& year%100!=0);
}
private void printMonthTitle(int year, int month)
{
System.out.println(" "+getMonthName(month)+" " + year);
System.out.println("*****************************");
System.out.println(" Sun Mon Tue Wed Thu Pri Sat ");
}
private String getMonthName(int month)
{
String name = "";
switch (month)
{
case 1:name = "January";break;
case 2:name = "February";break;
case 3:name = "March";break;
case 4:name = "April";break;
case 5:name = "May";break;
case 6:name = "June";break;
case 7:name = "July";break;
case 8:name = "August";break;
case 9:name = "September";break;
case 10:name = "October";break;
case 11:name = "November";break;
case 12:name = "December";break;
}
return name;
}
public static void main(String[] args)
{
String yearString= JOptionPane.showInputDialog("Enter full year(e.g.,2001) : ");
String monthString = JOptionPane.showInputDialog("Enter month as number 1 and 12 : ");
int year = Integer.parseInt(yearString);
int month = Integer.parseInt(monthString);
Calender calender = new Calender();
calender.printMonth(year,month);
}
}
比如输入2015和1则得到
January 2015
*****************************
Sun Mon Tue Wed Thu Pri Sat
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