[B]//JavaScript语法[/B]<script language="JavaScript" > var CalendarData=new Array(20); var madd=new Array(12); var TheDate=new Date(); var tgString="甲乙丙丁戊己庚辛壬癸"; var dzString="子丑寅卯辰巳午未申酉戌亥"; var numString="一二三四五六七八九十"; var monString="正二三四五六七八九十冬腊"; var weekString="日一二三四五六"; var sx="鼠牛虎兔龙蛇马羊猴鸡狗猪"; var cYear; var cMonth; var cDay; var cHour; var cDateString; var DateString; var Browser=navigator.appName; function init() { CalendarData[0]=0x41A95; CalendarData[1]=0xD4A; CalendarData[2]=0xDA5; CalendarData[3]=0x20B55; CalendarData[4]=0x56A; CalendarData[5]=0x7155B; CalendarData[6]=0x25D; CalendarData[7]=0x92D; CalendarData[8]=0x5192B; CalendarData[9]=0xA95; CalendarData[10]=0xB4A; CalendarData[11]=0x416AA; CalendarData[12]=0xAD5; CalendarData[13]=0x90AB5; CalendarData[14]=0x4BA; CalendarData[15]=0xA5B; CalendarData[16]=0x60A57; CalendarData[17]=0x52B; CalendarData[18]=0xA93; CalendarData[19]=0x40E95; madd[0]=0; madd[1]=31; madd[2]=59; madd[3]=90; madd[4]=120; madd[5]=151; madd[6]=181; madd[7]=212; madd[8]=243; madd[9]=273; madd[10]=304; madd[11]=334; } function GetBit(m,n) { return (m>>n)&1; } function e2c() { var total,m,n,k; var isEnd=false; var tmp=TheDate.getYear(); if (tmp<1900) tmp+=1900; total=(tmp-2001)*365 +Math.floor((tmp-2001)/4) +madd[TheDate.getMonth()] +TheDate.getDate() -23; if (TheDate.getYear()%4==0&&TheDate.getMonth()>1) total++; for(m=0;;m++) { k=(CalendarData[m]<0xfff)?11:12; for(n=k;n>=0;n--) { if(total<=29+GetBit(CalendarData[m],n)) { isEnd=true; break; } total=total-29-GetBit(CalendarData[m],n); } if(isEnd)break; } cYear=2001 + m; cMonth=k-n+1; cDay=total; if(k==12) { if(cMonth==Math.floor(CalendarData[m]/0x10000)+1) cMonth=1-cMonth; if(cMonth>Math.floor(CalendarData[m]/0x10000)+1) cMonth--; } cHour=Math.floor((TheDate.getHours()+3)/2); } function GetcDateString() { var tmp=""; tmp+=tgString.charAt((cYear-4)%10); //年干 tmp+=dzString.charAt((cYear-4)%12); //年支 tmp+="年("; tmp+=sx.charAt((cYear-4)%12); tmp+=")"; if(cMonth<1) { tmp+="闰"; tmp+=monString.charAt(-cMonth-1); } else tmp+=monString.charAt(cMonth-1); tmp+="月"; tmp+=(cDay<11)?"初":((cDay<20)?"十":((cDay<30)?"廿":"卅")); if(cDay%10!=0||cDay==10) tmp+=numString.charAt((cDay-1)%10); if(cHour==13)tmp+="夜"; tmp+=dzString.charAt((cHour-1)%12); tmp+="时"; cDateString=tmp; return tmp; } function GetDateString() { var tmp=""; var t1=TheDate.getYear(); if (t1<1900)t1+=1900; tmp+=t1 +"-" +(TheDate.getMonth()+1)+"-" +TheDate.getDate()+" " +TheDate.getHours()+":" +((TheDate.getMinutes()<10)?"0":"") +TheDate.getMinutes() +" 星期"+weekString.charAt(TheDate.getDay()); DateString=tmp; return tmp; } init(); e2c(); GetDateString(); GetcDateString(); document.write(DateString,"<br>",cDateString); </script> [B]//关于农历[/B] 农 历 农历是我国的一种历法,又称夏历、中历、旧历,俗称阴历。定月的方法是用朔望月周期给出,朔所在日为初一,朔望月长约29天半,所以农历大月30天,小月29天。农历平年有十二个月,全年354天或355天,闰年为十三个月,其中某一月为闰月,月名依前一月名而定,如前月是八月,闰月则为闰八月。闰年全年383天或384天。设置闰月的方法是:农历月份中无“中气”的月份则是闰月。 农历平年、闰年的月数、天数一览表 年 月数 大月天数 小月天数 全年天数 闰月设置方法 平年 12 30 29 354 大约19年中7个闰月 闰年 13 30 29 383(或384) 无中气月份为闰月 二十四节气中四季“节气”和“中气”一览表 四季 春 夏 秋 冬 节气 立春 惊蛰 清明 立夏 芒种 小暑 立秋 白露 寒露 立冬 大雪 小寒 中气 雨水 春分 谷雨 小满 夏至 大暑 处暑 秋分 霜降 小雪 冬至 大寒 农历又根据太阳的位置,把太阳年分成二十四个节气,反映寒冷暑热的气候变化,以便家事活动,所以农历实为阴阳历。 如何转换阴阳历? 很多人都一直在找换阴阳历的公式。我也尝试过。曾读过「高平子」天文前辈所着「学历散论」了解古历的变更和阴阳历的缺陷。才知道由於月球转动的不稳定不规则,确定无公式可寻。这也是古代中国每百年必改历的原因。 阴历最大的问题是在如何置闰。好像不难,因为阴历基本法则如下: * 月朔日即是初一 * 月以中气得名 * 以包含雨水中气月为正月,即是「寅」月 * 月无中气者为闰月,以前月同名 如果,日月转动循还有规则的话, 推演一套阴阳历转换的公式并不难。问题在有时一个太阴月比一个太阳月还要长。如此一个太阴月就有可能包括两个中气。此双中气月後的阴历月名就全部乱掉了,直到下一个「假」闰月後才调整过来。 一般人接触到的阴阳历是民用历法,它是政府颁令的以东经120度计算的历法或称中原标准时间或北京时。如果,我们用不同时区、不同经度为子午线来重新计算阴阳历,民用历法的置闰法则出了很大的问题。不同时区的闰月可能落在不同月。换言之,在一百年内,任何两个时区的闰月顺序模式是会不相同的。 高平子前辈书中提到了「历理置闰法」。如果应用历理置闰法到不同时区,则所有不同时区的闰月都落在相同月。如此不同时区、不同经度的阴阳历置闰之问题就消失了。民用置闰和历理置闰的不同是: * 在民用置闰,如果月朔日和中气同一天,则该阴历月包含那个中气。 * 在历理置闰,如果月朔日和中气同一天,月朔日时间必须在中气时间之前,则该阴历月才包含那个中气。 简言之,民用置闰比较月朔和中气日期;历理置闰比较月朔和中气日期、时、分、秒。由此可知,没有精确的太阳和月亮的时间数字,阴历的闰月可能会排错了。 基於这些理由,我着手寻找天文公式计算精确的太阳和月亮在纬度的时间。当年没有网路,发了大半年於美国南加州各大图书馆及大学,找寻答案。1993年出版了「中美天文万年历」一书。书中精确的天文日月时间只从1900到2010年。因恐2011後时间误差超过一分钟,不够精确,不敢印出。今年2002从网路资讯,确定太阳和月亮时间的精确度後,百忙中重新整理资料,提供给需要阴阳历转换公式的朋友。 整理出的太阳和月亮时间数字是从西元1年到2246年。有历理和中国民用两套历法。数字内容清清楚楚的看出民用历法的敝端。例如,从西元1600年到2246年,民用历法双中气的阴历月有22个,历理历法只有5个。民用历法甚至在2033、2128和2242年中,三个月之间居然跑出两个双中气;换言之,三个月中多出两个「假」闰月。前後12个阴历月中有三个闰月,闰月的去留造成许多学者的讨论和困恼。历理历法在此三年中,却没有发现到双中气阴历月。闰月的去留只要把双中气月後的「假」闰月取消,则历理历法近乎於完美。 由此可知,民用历法问题很大,应该废除。上次阴阳历重大改历在1645年,已经超过350年。随着天文科学的进步,中国阴阳历应该使用较精确的历理历法。免得後代子孙再浪费时间讨论置闰去留的问题。
阴阳历应用在八字算命、紫微斗数、农民历、遁甲历最多。很多人不知道排八字只用阳历而不用阴历。发了许多时间在研究阴阳历的转换。其实八字只使用太阳中节气,和月亮没有任何关系。紫微斗数则需要阴历日期去排命盘。美国时区的阴历日期有一半和中国时区的阴历日期差一天,因为时差超过12小时;初一就可能在不同日之故。有位在加拿大职业算命的朋友,精通八字和紫微斗数,研究其女命盘。八字论父母,合情合理。斗数父母宫,看不出自己影子。後来,在中美天文万年历一书发现了「差一天」之解答。 曾有一位退休博士用了近三十年找寻阴阳历的公式,问遍两岸各大天文台,得不到答案,直到发现中美天文万年历一书。最後,希望我重新整理的中国阴阳历的天文数字和原始程式,能给有求知欲於阴阳历转换方法的读友一个答案,以免得不到答案而遗憾终身。 中国阴阳历的天文数字和原始程式用简单英文阐述, 请从下述 Chinese Lunar Calendar 进入。
------------------------------------------------------------------ 高平子 Kao Ping Tse”1888-1970〔是中国近代最有成就的天文学者之一。他没有接受正规的天文教育。凭着对天文的酷爱,自己研读天文书籍。因为他对天文的贡献,在他的百年冥诞,月球的一个环形月坑以他的名字为名。位置在月球东经87.6度,南纬6.7度, 直径34公里,为国争光。
在百度中搜索:公历转换农历的算法
上一篇:javascript弹出窗体 下一篇:JScript 教程
|