很好用的js日曆演算法詳細代碼

來源:互聯網
上載者:User

複製代碼 代碼如下:<script type="text/javascript">
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, 0x052d0, 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)
var Animals = new Array("鼠", "牛", "虎", "兔", "龍", "蛇", "馬", "羊", "猴", "雞", "狗", "豬");
var Gan = new Array("甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸");
var Zhi = new Array("子", "醜", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥");
var now = new Date();
var SY = now.getFullYear();
var SM = now.getMonth();
var SD = now.getDate();

//==== 傳入 offset 傳回幹支, 0=甲子
function cyclical(num) { return (Gan[num % 10] + Zhi[num % 12]) }

//==== 傳回農曆 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 .yearCyl .dayCyl .monCyl
function Lunar(objDate) {
var i, leap = 0, temp = 0
var baseDate = new Date(1900, 0, 31)
var offset = (objDate - baseDate) / 86400000

this.dayCyl = offset + 40
this.monCyl = 14

for (i = 1900; i < 2050 && offset > 0; i++) {
temp = lYearDays(i)
offset -= temp
this.monCyl += 12
}
if (offset < 0) {
offset += temp;
i--;
this.monCyl -= 12
}

this.year = i
this.yearCyl = i - 1864

leap = leapMonth(i) //閏哪個月
this.isLeap = false

for (i = 1; i < 13 && offset > 0; i++) {
//閏月
if (leap > 0 && i == (leap + 1) && this.isLeap == false)
{ --i; this.isLeap = true; temp = leapDays(this.year); }
else
{ temp = monthDays(this.year, i); }

//解除閏月
if (this.isLeap == true && i == (leap + 1)) this.isLeap = false

offset -= temp
if (this.isLeap == false) this.monCyl++
}

if (offset == 0 && leap > 0 && i == leap + 1)
if (this.isLeap)
{ this.isLeap = false; }
else
{ this.isLeap = true; --i; --this.monCyl; }

if (offset < 0) { offset += temp; --i; --this.monCyl; }

this.month = i
this.day = offset + 1
}

function YYMMDD() {
var cl = '<font color="#0000df" STYLE="font-size:9pt;">';
if (now.getDay() == 0) cl = '<font color="#c00000" STYLE="font-size:9pt;">';
if (now.getDay() == 6) cl = '<font color="#00c000" STYLE="font-size:9pt;">';
return (cl + SY + '年' + (SM + 1) + '月' + SD + '日</font>');
}
function weekday() {
var day = new Array("星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六");
var cl = '<font color="#000000" STYLE="font-size:9pt;">';
if (now.getDay() == 0) cl = '<font color="#ff0000" STYLE="font-size:9pt;">';
if (now.getDay() == 6) cl = '<font color="#ff0000" STYLE="font-size:9pt;">';
return (cl + day[now.getDay()] + '</font>');
}
//==== 中文日期
function cDay(m, d) {
var nStr1 = new Array('日', '一', '二', '三', '四', '五', '六', '七', '八', '九', '十');
var nStr2 = new Array('初', '十', '廿', '卅', ' ');
var s;
if (m > 10) { s = '十' + nStr1[m - 10] } else { s = nStr1[m] } s += '月'
switch (d) {
case 10: s += '初十'; break;
case 20: s += '二十'; break;
case 30: s += '三十'; break;
default: s += nStr2[Math.floor(d / 10)]; s += nStr1[d % 10];
}
return (s);
}

function solarDay2() {
var sDObj = new Date(SY, SM, SD);
var lDObj = new Lunar(sDObj);
var cl = '<font color="#000066" STYLE="font-size:9pt;">';
//農曆BB'+(cld[d].isLeap?'閏 ':' ')+cld[d].lMonth+' 月 '+cld[d].lDay+' 日
var tt = '農曆' + cDay(lDObj.month, lDObj.day);
return (cl + tt + '</font>');
}
function solarDay3() {
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 solarTerm = new Array("小寒", "大寒", "立春", "雨水", "驚蟄", "春分", "清明", "穀雨", "立夏", "小滿", "芒種", "夏至", "小暑", "大暑", "立秋", "處暑", "白露", "秋分", "寒露", "霜降", "立冬", "小雪", "大雪", "冬至")
var lFtv = new Array("0101*春節", "0115 元宵節", "0505 端午節", "0707 七夕情人節", "0715 中元節", "0815 中秋節", "0909 重陽節", "1208 臘八節", "1224 小年", "0100*除夕")
var sFtv = new Array("0101*元旦", "0214 情人節", "0308 婦女節", "0312 植樹節", "0315 消費者權益日", "0401 愚人節", "0501 勞動節", "0504 青年節", "0512 護士節", "0601 兒童節", "0701 建黨節 香港迴歸紀念",
"0801 建軍節", "0808 父親節", "0909 南晟網周年紀念日", "0910 教師節", "0928 孔子誕辰", "1001*國慶節",
"1006 老人節", "1024 聯合國日", "1112 孫中山誕辰", "1220 澳門迴歸紀念", "1225 聖誕節", "1226 毛主席誕辰")

var sDObj = new Date(SY, SM, SD);
var lDObj = new Lunar(sDObj);
var lDPOS = new Array(3)
var festival = '', solarTerms = '', solarFestival = '', lunarFestival = '', tmp1, tmp2;
//農曆節日
for (i in lFtv)
if (lFtv[i].match(/^(\d{2})(.{2})([\s\*])(.+)$/)) {
tmp1 = Number(RegExp.$1) - lDObj.month
tmp2 = Number(RegExp.$2) - lDObj.day
if (tmp1 == 0 && tmp2 == 0) lunarFestival = RegExp.$4
}
//國曆節日
for (i in sFtv)
if (sFtv[i].match(/^(\d{2})(\d{2})([\s\*])(.+)$/)) {
tmp1 = Number(RegExp.$1) - (SM + 1)
tmp2 = Number(RegExp.$2) - SD
if (tmp1 == 0 && tmp2 == 0) solarFestival = RegExp.$4
}
//節氣
tmp1 = new Date((31556925974.7 * (SY - 1900) + sTermInfo[SM * 2 + 1] * 60000) + Date.UTC(1900, 0, 6, 2, 5))
tmp2 = tmp1.getUTCDate()
if (tmp2 == SD) solarTerms = solarTerm[SM * 2 + 1]
tmp1 = new Date((31556925974.7 * (SY - 1900) + sTermInfo[SM * 2] * 60000) + Date.UTC(1900, 0, 6, 2, 5))
tmp2 = tmp1.getUTCDate()
if (tmp2 == SD) solarTerms = solarTerm[SM * 2]

if (solarTerms == '' && solarFestival == '' && lunarFestival == '')
festival = '';
else
festival = '<FONT COLOR="#ff0000" STYLE="font-size:9pt;">' + solarTerms + ' ' + solarFestival + ' ' + lunarFestival + '</FONT>';

var cl = '<font color="#000066" STYLE="font-size:9pt;">';
return (cl + festival + '</font>');
}
function setCalendar() {

document.write(YYMMDD() + ' ' + weekday() + ' ' + solarDay2() + ' ' + solarDay3());
}

setCalendar();
//-->

//擷取當月的陽曆天數
function getNowMonthDays(year, month) {
var isy = false;
if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) isy = true;
switch (month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
return 31;
case 4:
case 6:
case 9:
case 11:
return 30;
case 2:
return isy ? 28 : 29;
}
}
//擷取該月一號是周幾
function getStartWeek() {
var tempnum = SD % 7;
var week = now.getDay() + 1; //今天周幾
var startweek = week + 7 - tempnum;
return startweek > 7 ? startweek % 7 : startweek;
}

//擷取農曆
function getSolarDay(year, month, day) {
var sDObj = new Date(year, month, day);
var lDObj = new Lunar(sDObj);
//農曆BB'+(cld[d].isLeap?'閏 ':' ')+cld[d].lMonth+' 月 '+cld[d].lDay+' 日
return cDay(lDObj.month, lDObj.day);
}

//月視圖
function showMonth() {
debugger;
var days = getNowMonthDays(SY, SM + 1);
var startweek = getStartWeek();
var html = "<tr><td>星期一</td><td>星期二</td><td>星期三</td><td>星期四</td><td>星期五</td><td>星期六</td><td>星期日</td></tr><tr>";
var index = 0;
for (var i = 1; i < startweek; i++) {
html += "<td> </td>"; index++;
}
for (var i = 1; i <= days; i++) {

if (index % 7 == 0) {
html += "</tr><tr>";
} html += "<td>" + i + "<br>" + getSolarDay(SY, SM, i) + "</td>";
index++;
}
for (var i = 0; i < 7; i++) {
if (index % 7 == 0) {
break;
}
html += "<td> </td>"; index++;
}
html += "</tr>";
$("#table_calendar").html(html);
}

</script>

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.