?? lunar.js
字號:
//獲得任意日期的農歷,以及各種節日、節氣等 isaac 修改萬年歷而得 Aug 2nd 2005
/*****************************************************************************
日期資料
*****************************************************************************/
var lunarInfo=new Array(
0x04bd8,0x04ae0,0x0a570,0x054d5,0x0d260,0x0d950,0x16554,0x056a0,0x09ad0,0x055d2,
0x04ae0,0x0a5b6,0x0a4d0,0x0d250,0x1d255,0x0b540,0x0d6a0,0x0ada2,0x095b0,0x14977,
0x04970,0x0a4b0,0x0b4b5,0x06a50,0x06d40,0x1ab54,0x02b60,0x09570,0x052f2,0x04970,
0x06566,0x0d4a0,0x0ea50,0x06e95,0x05ad0,0x02b60,0x186e3,0x092e0,0x1c8d7,0x0c950,
0x0d4a0,0x1d8a6,0x0b550,0x056a0,0x1a5b4,0x025d0,0x092d0,0x0d2b2,0x0a950,0x0b557,
0x06ca0,0x0b550,0x15355,0x04da0,0x0a5d0,0x14573,0x052b0,0x0a9a8,0x0e950,0x06aa0,
0x0aea6,0x0ab50,0x04b60,0x0aae4,0x0a570,0x05260,0x0f263,0x0d950,0x05b57,0x056a0,
0x096d0,0x04dd5,0x04ad0,0x0a4d0,0x0d4d4,0x0d250,0x0d558,0x0b540,0x0b5a0,0x195a6,
0x095b0,0x049b0,0x0a974,0x0a4b0,0x0b27a,0x06a50,0x06d40,0x0af46,0x0ab60,0x09570,
0x04af5,0x04970,0x064b0,0x074a3,0x0ea50,0x06b58,0x055c0,0x0ab60,0x096d5,0x092e0,
0x0c960,0x0d954,0x0d4a0,0x0da50,0x07552,0x056a0,0x0abb7,0x025d0,0x092d0,0x0cab5,
0x0a950,0x0b4a0,0x0baa4,0x0ad50,0x055d9,0x04ba0,0x0a5b0,0x15176,0x052b0,0x0a930,
0x07954,0x06aa0,0x0ad50,0x05b52,0x04b60,0x0a6e6,0x0a4e0,0x0d260,0x0ea65,0x0d530,
0x05aa0,0x076a3,0x096d0,0x04bd7,0x04ad0,0x0a4d0,0x1d0b6,0x0d250,0x0d520,0x0dd45,
0x0b5a0,0x056d0,0x055b2,0x049b0,0x0a577,0x0a4b0,0x0aa50,0x1b255,0x06d20,0x0ada0,
0x14b63
);
var solarMonth=new Array(31,28,31,30,31,30,31,31,30,31,30,31);
var Gan=new Array("甲","乙","丙","丁","戊","己","庚","辛","壬","癸");
var Zhi=new Array("子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥");
var Animals=new Array("鼠","牛","虎","兔","龍","蛇","馬","羊","猴","雞","狗","豬");
var solarTerm = new Array("小寒","大寒","立春","雨水","驚蟄","春分","清明","谷雨","立夏","小滿","芒種","夏至","小暑","大暑","立秋","處暑","白露","秋分","寒露","霜降","立冬","小雪","大雪","冬至");
var sTermInfo = new Array(0,21208,42467,63836,85337,107014,128867,150921,173149,195551,218072,240693,263343,285989,308563,331033,353350,375494,397447,419210,440795,462224,483532,504758);
var nStr1 = new Array('日','一','二','三','四','五','六','七','八','九','十');
var nStr2 = new Array('初','十','廿','卅','□');
var nStr3 = new Array("正", "二", "三", "四", "五", "六", "七", "八", "九", "十", "冬", "臘");
//公歷節日,*表示放假
var sFtv = new Array(
"0101 元旦",
"0202 世界濕地日",
"0207 聲援南非日",
"0210 國際氣象節",
"0214 情人節",
"0301 國際海豹日",
"0303 全國愛耳日",
"0308 國際婦女節",
"0312 植樹節",
"0314 國際警察日",
"0315 消費者權益日",
"0317 國際航海日",
"0321 世界森林日",
"0321 世界兒歌日",
"0322 世界水日",
"0323 世界氣象日",
"0401 愚人節",
"0407 世界衛生日",
"0422 世界地球日",
"0501 國際勞動節",
"0504 五四青年節",
"0505 碘缺乏防治日",
"0508 世界紅十字日",
"0512 國際護士節",
"0515 國際家庭日",
"0517 世界電信日",
"0518 國際博物館日",
"0520 學生營養日",
"0523 國際牛奶日",
"0531 世界無煙日",
"0601 國際兒童節",
"0605 世界環境日",
"0606 全國愛眼日",
"0617 防治荒漠化日",
"0623 奧林匹克日",
"0625 全國土地日",
"0626 國際反毒日",
"0701 黨的生日",
"0707 抗日紀念日",
"0711 世界人口日",
"0730 非洲婦女日",
"0801 建軍節",
"0815 日本投降日",
"0908 國際掃盲日",
"0910 中國教師節",
"0914 清潔地球日",
"0916 臭氧層保護日",
"0918 九一八紀念",
"0920 國際愛牙日",
"0927 世界旅游日",
"1001 國慶節",
"1004 世界動物日",
"1008 全國高血壓日",
"1008 世界視覺日",
"1009 世界郵政日",
"1013 世界保健日",
"1015 國際盲人節",
"1016 世界糧食日",
"1017 世界消貧日",
"1022 世界醫藥日",
"1024 聯合國日",
"1031 世界勤儉日",
"1108 中國記者日",
"1109 消防宣傳日",
"1110 世界青年節",
"1112 孫中山誕辰",
"1114 世界糖尿病日",
"1117 國際大學生節",
"1121 世界電視日",
"1201 世界艾滋病日",
"1203 世界殘疾人日",
"1208 兒童電視日",
"1209 世界足球日",
"1210 世界人權日",
"1212 西安事變紀念",
"1213 南京大屠殺",
"1221 國際籃球日",
"1224 平安夜",
"1225 圣誕節",
"1226 毛澤東誕辰",
"1229 生物多樣性日"
);
//某月的第幾個星期幾。 5,6,7,8 表示到數第 1,2,3,4 個星期幾
var wFtv = new Array(
"0110 黑人日",
"0520 母親節",
"0530 全國助殘日",
"0630 父親節",
"0911 勞動節",
"0932 國際和平日",
"0940 國際聾人節",
"0950 世界海事日",
"1011 國際住房日",
"1144 感恩節"
);
//農歷節日
var lFtv = new Array(
"0101 春節",
"0115 元宵節",
"0202 龍抬頭節",
"0505 端午節",
"0707 七七鵲橋節",
"0714 鬼節",
"0815 中秋節",
"0909 重陽節",
"1208 臘八節",
"0100 除夕"
);
//計算農歷,發現萬年歷里面的農歷年是tmd錯的,居然以立春為分界,我靠
//找到我以前改的這個,以年初一為分界的,嗯,兩個合并一下 isaac 2006.1.21
//不過原來那個錯的,因為可以計算節日,也不知道哪些代碼是多余的
//估計多余部分不少,懶得看了.....
function LunarDate(tY,tM,tD) {
var TianGan = new Array( // 天干名稱
"甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸");
var DiZhi = new Array( // 地支名稱
"子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥");
var ShuXiang = new Array( // 屬相名稱
"鼠", "牛", "虎", "兔", "龍", "蛇", "馬", "羊", "猴", "雞", "狗", "豬");
var DayName = new Array("*", // 農歷日期名
"初一", "初二", "初三", "初四", "初五", "初六", "初七", "初八", "初九", "初十",
"十一", "十二", "十三", "十四", "十五", "十六", "十七", "十八", "十九", "二十",
"廿一", "廿二", "廿三", "廿四", "廿五", "廿六", "廿七", "廿八", "廿九", "三十");
var MonName = new Array("*", // 農歷月份名
"正", "二", "三", "四", "五", "六", "七", "八", "九", "十", "冬", "臘");
var MonthAdd = new Array( // 公歷每月前面的天數
0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334);
var NongLiData = new Array( // 農歷數據
2635, 333387, 1701, 1748, 267701, 694, 2391, 133423, 1175, 396438, 3402, 3749,
331177, 1453, 694, 201326, 2350, 465197, 3221, 3402, 400202, 2901, 1386, 267611,
605, 2349, 137515, 2709, 464533, 1738, 2901, 330421, 1242, 2651, 199255, 1323,
529706, 3733, 1706, 398762, 2741, 1206, 267438, 2647, 1318, 204070, 3477, 461653,
1386, 2413, 330077, 1197, 2637, 268877, 3365, 531109, 2900, 2922, 398042, 2395,
1179, 267415, 2635, 661067, 1701, 1748, 398772, 2742, 2391, 330031, 1175, 1611,
200010, 3749, 527717, 1452, 2742, 332397, 2350, 3222, 268949, 3402, 3493, 133973,
1386, 464219, 605, 2349, 334123, 2709, 2890, 267946, 2773, 592565, 1210, 2651,
395863, 1323, 2707, 265877
);
this.CalcLunar = function() {
var i, m, n, k, isEnd, bit, TheDate;
var curYear = tY;
var curMonth = tM+1;
var curDay = tD;
// 計算到初始時間1921年2月8日的天數:1921-2-8(正月初一)
TheDate = (curYear - 1921) * 365 + Math.floor((curYear - 1921) / 4)
+ MonthAdd[curMonth - 1] - 38 + curDay;
if ((curYear%4)==0 && curMonth>2)
TheDate ++;
// 計算農歷天干、地支、月、日
isEnd = 0;
m = 0;
while (true) {
k = (NongLiData[m] < 4095 ? 11 : 12);
n = k
while (true) {
if (n < 0) break;
// 獲取 NongliData[m] 的第 n 個二進制位的值
bit = (NongLiData[m] >>> n) % 2;
if (TheDate <= 29 + bit) {
isEnd = 1;
break;
}
TheDate -= 29 + bit;
n --;
}
if (isEnd == 1) break;
m ++;
}
curYear = 1921 + m;
curMonth = k - n + 1;
curDay = TheDate;
if (k==12) {
if (curMonth==(Math.floor(NongLiData[m]/65536)+1)) {
curMonth = 1 - curMonth
} else if (curMonth > (Math.floor(NongLiData[m] / 65536) + 1)) {
curMonth --;
}
}
// 生成農歷天干、地支、屬相 ==> strLunar
strLunar = TianGan[((curYear - 4) % 60) % 10]
+ DiZhi[((curYear - 4) % 60) % 12] + "年 "
+ ShuXiang[((curYear - 4) % 60) % 12] + " ";
// 生成農歷月、日 ==> strLunarDay
strLunarDay = (curMonth < 1 ?
("閏" + MonName[-1 * curMonth]) : MonName[curMonth]
);
strLunarDay += "月" + DayName[curDay];
return (strLunar+" "+strLunarDay);
};
return(this.CalcLunar());
}
/*****************************************************************************
日期計算
*****************************************************************************/
//====================================== 傳回農歷 y年的總天數
function lYearDays(y) {
var i, sum = 348;
for(i=0x8000; i>0x8; i>>=1) sum += (lunarInfo[y-1900] & i)? 1: 0;
return(sum+leapDays(y));
}
//====================================== 傳回農歷 y年閏月的天數
function leapDays(y) {
if(leapMonth(y)) return((lunarInfo[y-1900] & 0x10000)? 30: 29);
else return(0);
}
//====================================== 傳回農歷 y年閏哪個月 1-12 , 沒閏傳回 0
function leapMonth(y) {
return(lunarInfo[y-1900] & 0xf);
}
//====================================== 傳回農歷 y年m月的總天數
function monthDays(y,m) {
return( (lunarInfo[y-1900] & (0x10000>>m))? 30: 29 );
}
//====================================== 算出農歷, 傳入日期物件, 傳回農歷日期物件
// 該物件屬性有 .year .month .day .isLeap
function Lunar(objDate) {
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -