<SCRIPT language=JavaScript> 
<!-- 
var bsYear; 
var bsDate; 
var bsWeek; 
var arrLen=8; //数组长度 
var sValue=0; //当年的秒数 
var dayiy=0; //当年第几天 
var miy=0; //月份的下标 
var iyear=0; //年份标记 
var dayim=0; //当月第几天 
var spd=86400; //每天的秒数 
 
var year1999="30;29;29;30;29;29;30;29;30;30;30;29"; //354 
var year2000="30;30;29;29;30;29;29;30;29;30;30;29"; //354 
var year2001="30;30;29;30;29;30;29;29;30;29;30;29;30"; //384 
var year2002="30;30;29;30;29;30;29;29;30;29;30;29"; //354 
var year2003="30;30;29;30;30;29;30;29;29;30;29;30"; //355 
var year2004="29;30;29;30;30;29;30;29;30;29;30;29;30"; //384 
var year2005="29;30;29;30;29;30;30;29;30;29;30;29"; //354 
var year2006="30;29;30;29;30;30;29;29;30;30;29;29;30"; 
问题:1、“var year1999="30;29;29;30;29;29;30;29;30;30;30;29";”这是干什么用的?
 var month1999="正月;二月;三月;四月;五月;六月;七月;八月;九月;十月;十一月;十二月" 
var month2001="正月;二月;三月;四月;闰四月;五月;六月;七月;八月;九月;十月;十一月;十二月" 
var month2004="正月;二月;闰二月;三月;四月;五月;六月;七月;八月;九月;十月;十一月;十二月" 
var month2006="正月;二月;三月;四月;五月;六月;七月;闰七月;八月;九月;十月;十一月;十二月" 
var Dn="初一;初二;初三;初四;初五;初六;初七;初八;初九;初十;十一;十二;十三;十四;十五;十六;十七;十八;十九;二十;廿一;廿二;廿三;廿四;廿五;廿六;廿七;廿八;廿九;三十"; 
 问题:2、“var month1999="正月;二月;三月;四月;五月;六月;七月;八月;九月;十月;十一月;十二月"”这又是干什么用的?
var Ys=new Array(arrLen); 
Ys[0]=919094400;Ys[1]=949680000;Ys[2]=980265600; 
Ys[3]=1013443200;Ys[4]=1044028800;Ys[5]=1074700800; 
Ys[6]=1107878400;Ys[7]=1138464000; 
问题3:3、“Ys[0]=919094400”这是什么意思? 有什么用?
var Yn=new Array(arrLen); //农历年的名称 
Yn[0]="己卯年";Yn[1]="庚辰年";Yn[2]="辛巳年"; 
Yn[3]="壬午年";Yn[4]="癸未年";Yn[5]="甲申年"; 
Yn[6]="乙酉年";Yn[7]="丙戌年"; 
var D=new Date(); 
var yy=D.getYear(); 
var mm=D.getMonth()+1;   问题4:“4、“var mm=D.getMonth()+1”中为什么要“+1”。”var dd=D.getDate(); 
var ww=D.getDay(); 
if (ww==0) ww="<font color=RED>星期日"; 
if (ww==1) ww="星期一"; 
if (ww==2) ww="星期二"; 
if (ww==3) ww="星期三"; 
if (ww==4) ww="星期四"; 
if (ww==5) ww="星期五"; 
if (ww==6) ww="<font color=RED>星期六"; 
ww=ww; 
var ss=parseInt(D.getTime() / 1000);  问题5:“这一句为什么要除以1000,“parseInt”有什么用?”
if (yy<100) yy="19"+yy; 问题6:这一句是什么意思 
 
for (i=0;i<arrLen;i++) 
if (ss>=Ys[i]){ 
iyear=i;         问题6:为什么会是当年的秒数?sValue=ss-Ys[i]; 

dayiy=parseInt(sValue/spd)+1; //当年的天数 
 
var dpm=year1999; 
if (iyear==1) dpm=year2000; 
if (iyear==2) dpm=year2001; 
if (iyear==3) dpm=year2002; 
if (iyear==4) dpm=year2003; 
if (iyear==5) dpm=year2004; 
if (iyear==6) dpm=year2005; 
if (iyear==7) dpm=year2006; 
dpm=dpm.split(";");    问题7:用split(;)进行分割,分割后的结果是什么? 
var Mn=month1999; 
if (iyear==2) Mn=month2001; 
if (iyear==5) Mn=month2004; 
if (iyear==7) Mn=month2006; 
Mn=Mn.split(";"); 
 
var Dn="初一;初二;初三;初四;初五;初六;初七;初八;初九;初十;十一;十二;十三;十四;十五;十六;十七;十八;十九;二十;廿一;廿二;廿三;廿四;廿五;廿六;廿七;廿八;廿九;三十"; 
Dn=Dn.split(";"); 
 
dayim=dayiy; 
 
var total=new Array(13); 
total[0]=parseInt(dpm[0]); 
for (i=1;i<dpm.length-1;i++) total[i]=parseInt(dpm[i])+total[i-1]; 
for (i=dpm.length-1;i>0;i--) 
if (dayim>total[i-1]){ 
dayim=dayim-total[i-1]; 
miy=i; 
}  问题8:这两个循环和IF实现的是什么功能?
bsWeek=ww; 
bsDate=yy+"年"+mm+"月"; 
bsDate2=dd; 
bsYear="农历"+Yn[iyear]; 
bsYear2=Mn[miy]+Dn[dayim-1]; 
if (ss>=Ys[7]||ss<Ys[0]) bsYear=Yn[7]; 
function CAL(){ 
document.write("<table border='0' cellspacing='0' width='100%' bordercolor='#FFFFFF'  cellpadding='0'>"); 
document.write("<tr><td align='center'><span style='FONT-SIZE: 12px'><font color=#666666>"+bsDate+"</font><font color=#666666>"+bsDate2+"日</font></span><font color=#666666><span style='FONT-SIZE: 14px'>"); 
document.write("  ");
document.write("<span style='FONT-SIZE: 12px'>"+bsWeek+"</span>"+"</font>"); 
document.write("  ");
document.write("<span style='FONT-SIZE: 12px'>"+"农历"+bsYear2+"</td></tr></table>"); 

//--> 
</SCRIPT>
这段代码实现的功能是:显示“2009年5月12日 星期二 农历闰七月十八”格式的日期。但在这之中有很多疑问?

解决方案 »

  1.   

    这个日历有些奇怪 ?getMonth()+1这好像是惯例  为什么我也不知道 期待高手
      

  2.   

    1.当年拥有的农历月份对应的日数,闰年有闰月.所以多一项;
    2.当年对应农历月份中文名
    3.对应年份春节的日期的零点的时间的电脑标准数除以1000
    4.getMonth 方法返回一个处于 0 到 11 之间的整数,它代表 Date 对象中的月份值。(摘自JS参考手册)
      所以要拿到真正月份的时候要加1.
    5.要和前面的春节日期数组的记数级别对应.所以除1000.
      parseInt()是将字符串中的数字专化成整数型字符.详细可参考JS参考手册.
    6.getYear 对于1900-1999这段时间而言,返回的年份值是一个两位数字的整数,它代表了所保存的年份与 1900 年之间的差距。而对于其它的年份,返回值是一个四位的整数。例如,1996 年的返回值是 96,而 1825 和 2025 年的返回值则相应地为 1825 和 2025。(摘自JS参考手册)
      所以他要转换成真正的年号.
      另一问题和前面的3,5有关.判断是否已经过年.
    7.分割之后就是字符串数组.如var year1999="30;29;29;30;29;29;30;29;30;30;30;29";
      分割后就是[30,29,29,30,29,29,30,29,30,30,30,29]这个数组.答完.拿分.哈.
      

  3.   

    一看就是js写的日历控件:
    你很有钻研精神,可嘉。我一般是从网上copy过来就用,懒得研究。
      

  4.   

    在这里首先谢谢吭!放心,分我一定会给你的,这是你应得的回报。但我还有几个问题想请教你一下.
    1、代码中没有标记其它年份,为什么,对其它年份也有用,比如2009年则输出“2009年5月13日 星期三 农历闰七月十九”,这是怎样实现的?
    2、我写的问题8你没看见,原因在我,我没有标记清楚,嘻嘻。问题:这两个循环和IF实现的是什么功能? 一句一句的给解释一下吧,麻烦你了。
    3、“if (ss>=Ys[7]||ss <Ys[0]) bsYear=Yn[7]; ”这个判断是干嘛用的?
      

  5.   

    1.因为日期的long型数用new Date()还是能得到的.所以程序一样算.只是算出来的结果是错的...今天应该是农历4月19日...闰七嘛...再过三过月吧...2.见上.3.判断是否超过他定义的年份.超过的话..就全按最后一个算...所以超过的年份全算错...
      

  6.   

    这里的农历算法才算精品呢.
    http://www.21softs.com/
      

  7.   

    呵呵,日历的算法,lz去网上看看.又很多.meize的很不错.
      

  8.   

    var total=new Array(13); 
    total[0]=parseInt(dpm[0]); 
    for (i=1;i <dpm.length-1;i++) total[i]=parseInt(dpm[i])+total[i-1]; 
    for (i=dpm.length-1;i>0;i--) 
    if (dayim>total[i-1]){ 
    dayim=dayim-total[i-1]; 
    miy=i; 

    这段代码还是看不太懂,你能给一句一句的解释一下吗?谢谢要不我在发一个帖子,加上分?