工作中要写一个带阴历的日历,自己调研了怎么做日历。
一.表格行数问题
既然要显示日期表格的话,首先得知道这个表格有多少行多少列,列数是已经确定的,从星期天(日历上第1列是星期天)到星期六一共7列。要解决行数问题之前,还得先知道这个月的第1天是星期几,因为每个月的1号并不都是从日历上的星期天开始排的,可能1号是星期五,星期六也说不定,所以1号的左边部分,就得用空表格代替了。那么用多少个空表格代替呢,这里就得用到getDay()方法了,该方法返回数组[0-6]中的一个数字,0代表星期天,1代表星期一,2代表星期二,以此类推。所以如果一个月的1号是星期五的话,那么刚好左边需要5个空表格代替。然后,假如一个月有31天,最后求出的表格行数就是:
vartr_nums=Math.ceil((5+31)/7);当然,并不是每个月都是31天,所以我们得创建一个包含12个月份的数组,每个元素代表每个月份所包含的天数。但是2月份比较特殊,闰年的2月份有29天,平年的2月份只有28天。所以,在创建数组之前,得自己创建一个判断闰年的函数:
vartoday=newDate(),//获取当前日期y=today.getFullYear(),//获取日期中的年份m=today.getMonth(),//获取日期中的月份(需要注意的是:月份是从0开始计算,获取的值比正常月份的值少1)d=today.getDate(),//获取日期中的日(方便在建立日期表格时高亮显示当天)firstday=newDate(y,m,1),//获取当月的第一天dayOfWeek=firstday.getDay(),//判断第一天是星期几(返回[0-6]中的一个,0代表星期天,1代表星期一,以此类推)days_per_month=newArray(31,28+isLeap(y),31,30,31,30,31,31,30,31,30,31),//创建月份数所以最后就可以获取当月所需表格的行数:
varstr_nums=Math.ceil((dayOfWeek+days_per_month[m])/7);//确定日期表格所需的行数完整的js代码:
从小就没搞懂了阴历和阳历中的换算问题,幸运的是从其他牛人那里找到了阴阳历的转换js代码,
/**公历年月日转农历数据返回json**/calendar.solar2lunar(1987,11,01);/**农历年月日转公历年月日**/calendar.lunar2solar(1987,9,10);//调用以上方法后返回类似如下object(json)具体以上就不需要解释了吧!//c开头的是公历各属性值l开头的自然就是农历咯gz开头的就是天干地支纪年的数据啦~{Animal:"兔",IDayCn:"初十",IMonthCn:"九月",Term:null,astro:"天蝎座",cDay:1,cMonth:11,cYear:1987,gzDay:"甲寅",gzMonth:"庚戌",gzYear:"丁卯",isLeap:false,isTerm:false,isToday:false,lDay:10,lMonth:9,lYear:1987,nWeek:7,ncWeek:"星期日"}//该代码还有其他可以调用的方法,请自己查看代码中的详细注释三、效果图
因为工作的源码不能泄露,所以日历的实现代码就不贴出了。但效果图如下: