编程珠玑里的日期函数

   编程珠玑第三章里有个问题是计算两个给定日子相差的天数;给定某个日期,判断它是星期几,或者说属于一周中的第几天;给定某年某月,打印这个月历

我用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

  

         

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值