javascript农历的算法

ChenReal

废话不说,直接上代码,需要的拿走!\n\njavascript\nfunction CalConv()\n {\n FIRSTYEAR = 1998;\n LASTYEAR = 2031;\n\n today = new Date();\n SolarYear = today.getFullYear();\n SolarMonth = today.getMonth() + 1;\n SolarDate = today.getDate();\n Weekday = today.getDay();\n LunarCal = [\n new tagLunarCal( 27, 5, 3, 43, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1 ),\n new tagLunarCal( 46, 0, 4, 48, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1 ), /* 88 */\n new tagLunarCal( 35, 0, 5, 53, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1 ), /* 89 */\n new tagLunarCal( 23, 4, 0, 59, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1 ),\n new tagLunarCal( 42, 0, 1, 4, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1 ),\n new tagLunarCal( 31, 0, 2, 9, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0 ),\n new tagLunarCal( 21, 2, 3, 14, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1 ), /* 93 */\n new tagLunarCal( 39, 0, 5, 20, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1 ),\n new tagLunarCal( 28, 7, 6, 25, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1 ),\n new tagLunarCal( 48, 0, 0, 30, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1 ),\n new tagLunarCal( 37, 0, 1, 35, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1 ), /* 97 */\n new tagLunarCal( 25, 5, 3, 41, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1 ),\n new tagLunarCal( 44, 0, 4, 46, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1 ),\n new tagLunarCal( 33, 0, 5, 51, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1 ),\n new tagLunarCal( 22, 4, 6, 56, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 ), /* 101 */\n new tagLunarCal( 40, 0, 1, 2, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 ),\n new tagLunarCal( 30, 9, 2, 7, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1 ),\n new tagLunarCal( 49, 0, 3, 12, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1 ),\n new tagLunarCal( 38, 0, 4, 17, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0 ), /* 105 */\n new tagLunarCal( 27, 6, 6, 23, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1 ),\n new tagLunarCal( 46, 0, 0, 28, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0 ),\n new tagLunarCal( 35, 0, 1, 33, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0 ),\n new tagLunarCal( 24, 4, 2, 38, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1 ), /* 109 */\n new tagLunarCal( 42, 0, 4, 44, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 ),\n new tagLunarCal( 31, 0, 5, 49, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0 ),\n new tagLunarCal( 21, 2, 6, 54, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1 ),\n new tagLunarCal( 40, 0, 0, 59, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1 ), /* 113 */\n new tagLunarCal( 28, 6, 2, 5, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0 ),\n new tagLunarCal( 47, 0, 3, 10, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1 ),\n new tagLunarCal( 36, 0, 4, 15, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1 ),\n new tagLunarCal( 25, 5, 5, 20, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0 ), /* 117 */\n new tagLunarCal( 43, 0, 0, 26, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1 ),\n new tagLunarCal( 32, 0, 1, 31, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0 ),\n new tagLunarCal( 22, 3, 2, 36, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0 ) ];\n /* 民國年每月之日數 */\n SolarCal = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ];\n\n /* 民國年每月之累積日數, 平年與閏年 */ \nSolarDays = [ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365, 396, 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366, 397 ];\n AnimalIdx = [\"马\", \"羊\", \"猴\", \"鸡\", \"狗\", \"猪\", \"鼠\", \"牛\", \"虎\", \"兔\", \"龙\", \"蛇\" ];\n LocationIdx = [ \"南\", \"东\", \"北\", \"西\" ];\n if ( SolarYear <= FIRSTYEAR || SolarYear > LASTYEAR ) return 1;\n sm = SolarMonth - 1;\n if ( sm < 0 || sm > 11 ) return 2;\n leap = GetLeap( SolarYear );\n if ( sm == 1 )\n d = leap + 28;\n else\n d = SolarCal[sm];\n if ( SolarDate < 1 || SolarDate > d ) return 3;\n y = SolarYear - FIRSTYEAR;\n acc = SolarDays[ leap*14 + sm ] + SolarDate;\n kc = acc + LunarCal[y].BaseKanChih;\n Kan = kc % 10;\n Chih = kc % 12;\n Location = LocationIdx[kc % 4];\n Age = kc % 60;\n if ( Age < 22 )\n Age = 22 - Age;\n else\n Age = 82 - Age;\n Animal = AnimalIdx[ Chih ];\n if ( acc <= LunarCal[y].BaseDays ) {\n y--;\n LunarYear = SolarYear - 1;\n leap = GetLeap( LunarYear );\n sm += 12;\n acc = SolarDays[leap*14 + sm] + SolarDate;\n }\n else\n LunarYear = SolarYear;\n l1 = LunarCal[y].BaseDays;\n for ( i=0; i<13; i++ ) {\n l2 = l1 + LunarCal[y].MonthDays[i] + 29;\n if ( acc <= l2 ) break;\n l1 = l2;\n }\n LunarMonth = i + 1;\n LunarDate = acc - l1;\n im = LunarCal[y].Intercalation;\n if ( im != 0 && LunarMonth > im ) {\n LunarMonth--;\n if ( LunarMonth == im ) LunarMonth = -im;\n }\n if ( LunarMonth > 12 ) LunarMonth -= 12;\n today=new Date();\n function initArray(){\n this.length=initArray.arguments.length\n for(var i=0;i<this.length;i++)\n this[i+1]=initArray.arguments[i] }\n var d=new initArray(\"星期日\",\"星期一\",\"星期二\",\"星期三\",\"星期四\",\"星期五\",\"星期六\");\n document.write(\"<span class=\\\"jsdhtml\\\"> \", today.getYear(),\" 年 \",today.getMonth()+1,\" 月 \",today.getDate(),\" 日 \",d[today.getDay()+1],\"\");\n document.write( \"<span class=\\\"jsdhtml\\\">【<u> 农历 \" + LunarMonth + \"月\" + LunarDate + \"日</u>】\" );\n document.write( \"煞\" + Location + \" 沖\" + Animal + Age + \"岁</span>\" );\n return 0; \n}\n /* 求此民國年是否為閏年, 返回 0 為平年, 1 為閏年 */\nfunction GetLeap( year )\n {\n if ( year % 400 == 0 )\n return 1;\n else if ( year % 100 == 0 )\n return 0;\n else if ( year % 4 == 0 )\n return 1;\n else\n return 0;\n }\n \nfunction tagLunarCal( d, i, w, k, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13) {\n this.BaseDays = d; /* 到民國 1 月 1 日到農曆正月初一的累積日數 */\n this.Intercalation = i; /* 閏月月份. 0==此年沒有閏月 */\n this.BaseWeekday = w; /* 此年民國 1 月 1 日為星期幾再減 1 */\n this.BaseKanChih = k; /* 此年民國 1 月 1 日之干支序號減 1 */\n this.MonthDays = [ m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13 ]; /* 此農曆年每月之大小, 0==小月(29日), 1==大月(30日) */\n}\n\n