万年历

万年历编写

       万年历操作:

       用户输入1900年之后的任何一个年份,就打印出这一年的日历表

       视图:

打印月份的日历视图 

编写万年历考虑的问题: 

第一  :  最关键的是知道用户输入的年份的第一天是星期几

第二 :  获得第一个问题的关键答案是1900年的第一天是星期一

第三 :  计算输入年份距离1900年1月1日的天数

          

 
 
  1. //这是计算输入年份距离1900年的天数,不包含该年的第一天  
  2. //返回计算得到的天数  
  3. public static int countDistanceDays(int y)  
  4.     {  
  5.         int totalDays=0;  
  6.         for(int i=1900; i<y; i++)  
  7.         {  
  8.             if(isPrime(i))  
  9.             {  
  10.                 totalDays+=366;  
  11.             }  
  12.             else  
  13.             {  
  14.                 totalDays+=365;   
  15.             }  
  16.         }  
  17.         return totalDays;  
  18.     } 

第四  : 考虑闰年的问题

          将闰年问题重构一个方法,这个方法在计算输入年份中的每一个月距离该年的第一天时用到.

 
 
  1. //返回boolean类型的结果  
  2. public static boolean isPrime(int y)  
  3.     {  
  4.         return (y%4==0 && y/100!=0 || y%400==0) ? true : false;  
  5.     } 

第四 :  如何计算每一天是星期几

             算法很简单:计算该月的第一天距离1900年1月1日的天数,用所得的结果对7求余所的结果就是我们在这个月的日历表的第一行要打印的空格数,接着就依次打印这个月的天数..

第五  :  计算输入的年份中每一个月的天数,这个结果用来打印该月的日历时使用的。

第六 :考虑输入的年份不是整型数据,得做异常处理

下面是万年历的源代码:

 

 
 
  1. import java.util.Scanner;  
  2. import java.util.InputMismatchException;  
  3. public class Calender  
  4. {  
  5.     //声明整型数组,存储一年中每一个月的天数  
  6.     public static int [] mds;  
  7.     //打印日历表的表头  
  8.     public static void printTitle()  
  9.     {  
  10.         System.out.println("日\t一\t二\t三\t四\t五\t六");  
  11.     }  
  12.     //判断输入的年份是否是闰年  
  13.     public static boolean isPrime(int y)  
  14.     {  
  15.         return (y%4==0 && y/100!=0 || y%400==0) ? true : false;  
  16.     }  
  17.     //计算月份第一天距离该年的第一天的天数  
  18.     public static int countDaysToYear(int m, int y)  
  19.     {  
  20.         int days=0;  
  21.         for(int i=1; i<m; i++)  
  22.         {  
  23.             if(i==1 || i==3 || i==5 || i==7 || i==8 || i==10 || i==12)  
  24.             {  
  25.                 days+=31;  
  26.             }  
  27.             else if(i==2)  
  28.             {  
  29.                 if(!isPrime(y))  
  30.                 {  
  31.                     days+=28;  
  32.                 }  
  33.                 else  
  34.                 {  
  35.                     days+=29;  
  36.                 }  
  37.             }  
  38.             else  
  39.             {  
  40.                 days+=30;  
  41.             }  
  42.         }  
  43.         return days;          
  44.     }  
  45.     //计算输入年份的第一天距离1900年1月1日的天数  
  46.     public static int countDistanceDays(int y)  
  47.     {  
  48.         int totalDays=0;  
  49.         for(int i=1900; i<y; i++)  
  50.         {  
  51.             if(isPrime(i))  
  52.             {  
  53.                 totalDays+=366;  
  54.             }  
  55.             else  
  56.             {  
  57.                 totalDays+=365;   
  58.             }  
  59.         }  
  60.         return totalDays;  
  61.     }  
  62.     //计算输入年份中每一个月的天数,并且放到数组中去  
  63.     public static int [] monthDays(int y)  
  64.     {  
  65.         int [] mds=new int[13];  
  66.           
  67.         for(int i=1; i<mds.length; i++)  
  68.         {  
  69.             if(i==1 || i==3 || i==5 || i==7 || i==8 || i==10 || i==12)  
  70.             {  
  71.                 mds[i]=31;  
  72.             }  
  73.             else if(i==2)  
  74.             {  
  75.                 if(!isPrime(y))  
  76.                 {  
  77.                     mds[i]=28;  
  78.                 }  
  79.                 else  
  80.                 {  
  81.                     mds[i]=29;  
  82.                 }  
  83.             }  
  84.             else  
  85.             {  
  86.                 mds[i]=30;  
  87.             }  
  88.         }  
  89.         return mds;  
  90.     }  
  91.     //打印每一个月的日历表  
  92.     public static void printCalender(int y, int ytd)  
  93.     {  
  94.         for(int i=1; i<=12; i++)  
  95.         {  
  96.             int w=0;  
  97.             System.out.println(i+"月份");  
  98.               
  99.             printTitle();  
  100.               
  101.  
  102.             int days=countDaysToYear(i, y);  
  103.               
  104.             int totalDays=ytd+days;  
  105.               
  106.             for(int k=0; k<totalDays%7; k++)  
  107.             {  
  108.                 System.out.print(" \t");  
  109.                 w++;  
  110.             }  
  111.  
  112.             for(int j=1; j<=mds[i]; j++)  
  113.             {  
  114.                 System.out.print(j+"\t");  
  115.                 w++;  
  116.                 if(w%7==0)  
  117.                 {  
  118.                     System.out.println();  
  119.                 }     
  120.             }  
  121.             System.out.println();  
  122.             System.out.println();     
  123.         }         
  124.     }  
  125.     //主函数,进行用户操作  
  126.     public static void main(String [] args)  
  127.     {  
  128.           
  129.         Scanner console=new Scanner(System.in);  
  130.         int year;  
  131.         System.out.print("请输入您所要打印日历的年份(请注意输入1900年以后的年份):");  
  132.         try{  
  133.             year=console.nextInt();  
  134.         }catch(InputMismatchException e){  
  135.             throw new InputMismatchException("Input number is error!");  
  136.         }  
  137.         int yearToDays=countDistanceDays(year);  
  138.         mds=monthDays(year);  
  139.         printCalender(year, yearToDays);  
  140.           
  141.     }     

 

数据很详细 CREATE TABLE `zb_calendar` ( `GregorianDateTime` varchar(255) DEFAULT NULL COMMENT '公历日期时间', `LunarDateTime` varchar(255) DEFAULT NULL COMMENT '农历日期时间', `LunarShow` varchar(255) DEFAULT NULL, `IsJieJia` varchar(255) DEFAULT NULL, `LJie` varchar(255) DEFAULT NULL COMMENT '农历节日', `GJie` varchar(255) DEFAULT NULL COMMENT '公历节日', `Yi` varchar(255) DEFAULT NULL COMMENT '宜', `Ji` varchar(255) DEFAULT NULL COMMENT '忌', `ShenWei` varchar(255) DEFAULT NULL COMMENT '神位', `Taishen` varchar(255) DEFAULT NULL COMMENT '胎神', `Chong` varchar(255) DEFAULT NULL COMMENT '冲煞', `SuiSha` varchar(255) DEFAULT NULL COMMENT '岁煞', `WuxingJiazi` varchar(255) DEFAULT NULL COMMENT '五行甲子', `WuxingNaYear` varchar(255) DEFAULT NULL COMMENT '纳音五行年', `WuxingNaMonth` varchar(255) DEFAULT NULL COMMENT '纳音五行月', `WuxingNaDay` varchar(255) DEFAULT NULL COMMENT '纳音五行日', `MoonName` varchar(255) DEFAULT NULL COMMENT '农历月名称', `XingEast` varchar(255) DEFAULT NULL COMMENT '星宿吉凶(东方星座)', `XingWest` varchar(255) DEFAULT NULL COMMENT '四方(星座)', `PengZu` varchar(255) DEFAULT NULL COMMENT '彭祖百忌', `JianShen` varchar(255) DEFAULT NULL COMMENT '黄历12值神建', `TianGanDiZhiYear` varchar(255) DEFAULT NULL COMMENT '天干地支年', `TianGanDiZhiMonth` varchar(255) DEFAULT NULL COMMENT '天干地支月', `TianGanDiZhiDay` varchar(255) DEFAULT NULL COMMENT '天干地支日', `LMonthName` varchar(255) DEFAULT NULL COMMENT '农历月名称', `LYear` varchar(255) DEFAULT NULL COMMENT '生肖', `LMonth` varchar(255) DEFAULT NULL COMMENT '农历月', `LDay` varchar(255) DEFAULT NULL COMMENT '农历日', `SolarTermName` varchar(255) DEFAULT NULL COMMENT '农历节气的名称' ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='万年历';
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值