JavaScript实现含节日、农历的日历详解编程语言

<title>JavaScript实现含节日、农历的日历</title> 
<table cellpadding="0" cellspacing="0" id="1"> 
<tr> 
<td> 
<style> 
body,td,.p1,.p2,.i { 
font-family: arial 
} 
body { 
margin: 6px 0 0 0; 
background-color: #fff; 
color: #000; 
} 
table { 
border: 0 
} 
#cal { 
width: 434px; 
border: 1px solid #c3d9ff; 
font-size: 12px; 
margin: 8px 0 0 15px 
} 
#cal #top { 
height: 29px; 
line-height: 29px; 
background: #e7eef8; 
color: #003784; 
padding-left: 70px 
} 
#cal #top select { 
font-size: 12px 
} 
#cal #top input { 
padding: 0 
} 
#cal ul#wk { 
margin: 0; 
padding: 0; 
height: 25px 
} 
#cal ul#wk li { 
float: left; 
width: 60px; 
text-align: center; 
line-height: 25px; 
list-style: none 
} 
#cal ul#wk li b { 
font-weight: normal; 
color: #c60b02 
} 
#cal #cm { 
clear: left; 
border-top: 1px solid #ddd; 
border-bottom: 1px dotted #ddd; 
position: relative 
} 
#cal #cm .cell { 
position: absolute; 
width: 42px; 
height: 36px; 
text-align: center; 
margin: 0 0 0 9px 
} 
#cal #cm .cell .so { 
font: bold 16px arial; 
} 
#cal #bm { 
text-align: right; 
height: 24px; 
line-height: 24px; 
padding: 0 13px 0 0 
} 
#cal #bm a { 
color: 7977ce 
} 
#cal #fd { 
display: none; 
position: absolute; 
border: 1px solid #dddddf; 
background: #feffcd; 
padding: 10px; 
line-height: 21px; 
width: 150px 
} 
#cal #fd b { 
font-weight: normal; 
color: #c60a00 
} 
</style> 
<!--[if IE]> 
<style> 
#cal #top{padding-top:4px} 
#cal #top input{width:65px} 
#cal #fd{width:170px} 
</style> 
<![endif]--> 
<div id="cal"> 
<div id="top">公元 <select> 
</select> 年 <select> 
</select> 月 农历<span>年 [ <span>年 ] <input type="button" 
value="回到今天" title="点击后跳转回今天" style="padding: 0px"></div> 
<ul id="wk"> 
<li>一</li> 
<li>二</li> 
<li>三</li> 
<li>四</li> 
<li>五</li> 
<li><b>六</b></li> 
<li><b>日</b></li> 
</ul> 
<div id="cm"></div> 
<div id="bm"></div> 
</div> 
</td> 
</tr> 
</table> 
<script type="text/javascript"> 
<!-- 
(function() { 
var S = navigator.userAgent.indexOf("MSIE") != -1 && !window.opera; 
function M(C) { 
return document.getElementById(C) 
} 
function R(C) { 
return document.createElement(C) 
} 
var P = [ 19416, 19168, 42352, 21717, 53856, 55632, 91476, 22176, 
39632, 21970, 19168, 42422, 42192, 53840, 119381, 46400, 54944, 
44450, 38320, 84343, 18800, 42160, 46261, 27216, 27968, 109396, 
11104, 38256, 21234, 18800, 25958, 54432, 59984, 28309, 23248, 
11104, 100067, 37600, 116951, 51536, 54432, 120998, 46416, 
22176, 107956, 9680, 37584, 53938, 43344, 46423, 27808, 46416, 
86869, 19872, 42448, 83315, 21200, 43432, 59728, 27296, 44710, 
43856, 19296, 43748, 42352, 21088, 62051, 55632, 23383, 22176, 
38608, 19925, 19152, 42192, 54484, 53840, 54616, 46400, 46496, 
103846, 38320, 18864, 43380, 42160, 45690, 27216, 27968, 44870, 
43872, 38256, 19189, 18800, 25776, 29859, 59984, 27480, 21952, 
43872, 38613, 37600, 51552, 55636, 54432, 55888, 30034, 22176, 
43959, 9680, 37584, 51893, 43344, 46240, 47780, 44368, 21977, 
19360, 42416, 86390, 21168, 43312, 31060, 27296, 44368, 23378, 
19296, 42726, 42208, 53856, 60005, 54576, 23200, 30371, 38608, 
19415, 19152, 42192, 118966, 53840, 54560, 56645, 46496, 22224, 
21938, 18864, 42359, 42160, 43600, 111189, 27936, 44448 ]; 
var K = "甲乙丙丁戊己庚辛壬癸"; 
var J = "子丑寅卯辰巳午未申酉戌亥"; 
var O = "鼠牛虎兔龙蛇马羊猴鸡狗猪"; 
var L = [ "小寒", "大寒", "立春", "雨水", "惊蛰", "春分", "清明", "谷雨", "立夏", "小满", 
"芒种", "夏至", "小暑", "大暑", "立秋", "处暑", "白露", "秋分", "寒露", "霜降", 
"立冬", "小雪", "大雪", "冬至" ]; 
var D = [ 0, 21208, 43467, 63836, 85337, 107014, 128867, 150921, 
173149, 195551, 218072, 240693, 263343, 285989, 308563, 331033, 
353350, 375494, 397447, 419210, 440795, 462224, 483532, 504758 ]; 
var B = "日一二三四五六七八九十"; 
var H = [ "正", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "腊" ]; 
var E = "初十廿卅"; 
var V = { 
"0101" : "*1元旦节", 
"0214" : "情人节", 
"0305" : "学雷锋纪念日", 
"0308" : "妇女节", 
"0312" : "植树节", 
"0315" : "消费者权益日", 
"0401" : "愚人节", 
"0501" : "*1劳动节", 
"0504" : "青年节", 
"0601" : "国际儿童节", 
"0701" : "中国共产党诞辰", 
"0801" : "建军节", 
"0910" : "中国教师节", 
"1001" : "*3国庆节", 
"1224" : "平安夜", 
"1225" : "圣诞节" 
}; 
var T = { 
"0101" : "*2春节", 
"0115" : "元宵节", 
"0505" : "*1端午节", 
"0815" : "*1中秋节", 
"0909" : "重阳节", 
"1208" : "腊八节", 
"0100" : "除夕" 
}; 
function U(Y) { 
function c(j, i) { 
var h = new Date((31556925974.7 * (j - 1900) + D[i] * 60000) 
+ Date.UTC(1900, 0, 6, 2, 5)); 
return (h.getUTCDate()) 
} 
function d(k) { 
var h, j = 348; 
for (h = 32768; h > 8; h >>= 1) { 
j += (P[k - 1900] & h) ? 1 : 0 
} 
return (j + b(k)) 
} 
function a(h) { 
return (K.charAt(h % 10) + J.charAt(h % 12)) 
} 
function b(h) { 
if (g(h)) { 
return ((P[h - 1900] & 65536) ? 30 : 29) 
} else { 
return (0) 
} 
} 
function g(h) { 
return (P[h - 1900] & 15) 
} 
function e(i, h) { 
return ((P[i - 1900] & (65536 >> h)) ? 30 : 29) 
} 
function C(m) { 
var k, j = 0, h = 0; 
var l = new Date(1900, 0, 31); 
var n = (m - l) / 86400000; 
this.dayCyl = n + 40; 
this.monCyl = 14; 
for (k = 1900; k<2050&&n>0; k++) { 
h = d(k); 
n -= h; 
this.monCyl += 12 
} 
if (n < 0) { 
n += h; 
k--; 
this.monCyl -= 12 
} 
this.year = k; 
this.yearCyl = k - 1864; 
j = g(k); 
this.isLeap = false; 
for (k = 1; k<13&&n>0; k++) { 
if (j > 0 && k == (j + 1) && this.isLeap == false) { 
--k; 
this.isLeap = true; 
h = b(this.year) 
} else { 
h = e(this.year, k) 
} 
if (this.isLeap == true && k == (j + 1)) { 
this.isLeap = false 
} 
n -= h; 
if (this.isLeap == false) { 
this.monCyl++ 
} 
} 
if (n == 0 && j > 0 && k == j + 1) { 
if (this.isLeap) { 
this.isLeap = false 
} else { 
this.isLeap = true; 
--k; 
--this.monCyl 
} 
} 
if (n < 0) { 
n += h; 
--k; 
--this.monCyl 
} 
this.month = k; 
this.day = n + 1 
} 
function G(h) { 
return h < 10 ? "0" + h : h 
} 
function f(i, j) { 
var h = i; 
return j.replace(/dd?d?d?|MM?M?M?|yy?y?y?/g, function(k) { 
switch (k) { 
case "yyyy": 
var l = "000" + h.getFullYear(); 
return l.substring(l.length - 4); 
case "dd": 
return G(h.getDate()); 
case "d": 
return h.getDate().toString(); 
case "MM": 
return G((h.getMonth() + 1)); 
case "M": 
return h.getMonth() + 1 
} 
}) 
} 
function Z(i, h) { 
var j; 
switch (i, h) { 
case 10: 
j = "初十"; 
break; 
case 20: 
j = "二十"; 
break; 
case 30: 
j = "三十"; 
break; 
default: 
j = E.charAt(Math.floor(h / 10)); 
j += B.charAt(h % 10) 
} 
return (j) 
} 
this.date = Y; 
this.isToday = false; 
this.isRestDay = false; 
this.solarYear = f(Y, "yyyy"); 
this.solarMonth = f(Y, "M"); 
this.solarDate = f(Y, "d"); 
this.solarWeekDay = Y.getDay(); 
this.solarWeekDayInChinese = "星期" + B.charAt(this.solarWeekDay); 
var X = new C(Y); 
this.lunarYear = X.year; 
this.shengxiao = O.charAt((this.lunarYear - 4) % 12); 
this.lunarMonth = X.month; 
this.lunarIsLeapMonth = X.isLeap; 
this.lunarMonthInChinese = this.lunarIsLeapMonth ? "闰" 
+ H[X.month - 1] : H[X.month - 1]; 
this.lunarDate = X.day; 
this.showInLunar = this.lunarDateInChinese = Z(this.lunarMonth, 
this.lunarDate); 
if (this.lunarDate == 1) { 
this.showInLunar = this.lunarMonthInChinese + "月" 
} 
this.ganzhiYear = a(X.yearCyl); 
this.ganzhiMonth = a(X.monCyl); 
this.ganzhiDate = a(X.dayCyl++); 
this.jieqi = ""; 
this.restDays = 0; 
if (c(this.solarYear, (this.solarMonth - 1) * 2) == f(Y, "d")) { 
this.showInLunar = this.jieqi = L[(this.solarMonth - 1) * 2] 
} 
if (c(this.solarYear, (this.solarMonth - 1) * 2 + 1) == f(Y, "d")) { 
this.showInLunar = this.jieqi = L[(this.solarMonth - 1) * 2 + 1] 
} 
if (this.showInLunar == "清明") { 
this.showInLunar = "清明节"; 
this.restDays = 1 
} 
this.solarFestival = V[f(Y, "MM") + f(Y, "dd")]; 
if (typeof this.solarFestival == "undefined") { 
this.solarFestival = "" 
} else { 
if (//*(/d)/.test(this.solarFestival)) { 
this.restDays = parseInt(RegExp.$1); 
this.solarFestival = this.solarFestival.replace(//*/d/, "") 
} 
} 
this.showInLunar = (this.solarFestival == "") ? this.showInLunar 
: this.solarFestival; 
this.lunarFestival = T[this.lunarIsLeapMonth ? "00" 
: G(this.lunarMonth) + G(this.lunarDate)]; 
if (typeof this.lunarFestival == "undefined") { 
this.lunarFestival = "" 
} else { 
if (//*(/d)/.test(this.lunarFestival)) { 
this.restDays = (this.restDays > parseInt(RegExp.$1)) ? this.restDays 
: parseInt(RegExp.$1); 
this.lunarFestival = this.lunarFestival.replace(//*/d/, "") 
} 
} 
if (this.lunarMonth == 12 
&& this.lunarDate == e(this.lunarYear, 12)) { 
this.lunarFestival = T["0100"]; 
this.restDays = 1 
} 
this.showInLunar = (this.lunarFestival == "") ? this.showInLunar 
: this.lunarFestival; 
this.showInLunar = (this.showInLunar.length > 4) ? this.showInLunar 
.substr(0, 2) 
+ "..." : this.showInLunar 
} 
var Q = (function() { 
var X = {}; 
X.lines = 0; 
X.dateArray = new Array(42); 
function Y(a) { 
return (((a % 4 === 0) && (a % 100 !== 0)) || (a % 400 === 0)) 
} 
function G(a, b) { 
return [ 31, (Y(a) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 
30, 31 ][b] 
} 
function C(a, b) { 
a.setDate(a.getDate() + b); 
return a 
} 
function Z(a) { 
var f = 0; 
var c = new U(new Date(a.solarYear, a.solarMonth - 1, 1)); 
var d = (c.solarWeekDay - 1 == -1) ? 6 : c.solarWeekDay - 1; 
X.lines = Math.ceil((d + G(a.solarYear, a.solarMonth - 1)) / 7); 
for ( var e = 0; e < X.dateArray.length; e++) { 
if (c.restDays != 0) { 
f = c.restDays 
} 
if (f > 0) { 
c.isRest = true 
} 
if (d-- > 0 || c.solarMonth != a.solarMonth) { 
X.dateArray[e] = null; 
continue 
} 
var b = new U(new Date()); 
if (c.solarYear == b.solarYear 
&& c.solarMonth == b.solarMonth 
&& c.solarDate == b.solarDate) { 
c.isToday = true 
} 
X.dateArray[e] = c; 
c = new U(C(c.date, 1)); 
f-- 
} 
} 
return { 
init : function(a) { 
Z(a) 
}, 
getJson : function() { 
return X 
} 
} 
})(); 
var W = (function() { 
var C = M("top").getElementsByTagName("SELECT")[0]; 
var X = M("top").getElementsByTagName("SELECT")[1]; 
var G = M("top").getElementsByTagName("SPAN")[0]; 
var c = M("top").getElementsByTagName("SPAN")[1]; 
var Y = M("top").getElementsByTagName("INPUT")[0]; 
function a(g) { 
G.innerHTML = g.ganzhiYear; 
c.innerHTML = g.shengxiao 
} 
function b(g) { 
C[g.solarYear - 1901].selected = true; 
X[g.solarMonth - 1].selected = true 
} 
function f() { 
var j = C.value; 
var g = X.value; 
var i = new U(new Date(j, g - 1, 1)); 
Q.init(i); 
N.draw(); 
if (this == C) { 
i = new U(new Date(j, 3, 1)); 
G.innerHTML = i.ganzhiYear; 
c.innerHTML = i.shengxiao 
} 
var h = new U(new Date()); 
Y.style.visibility = (j == h.solarYear && g == h.solarMonth) ? "hidden" 
: "visible" 
} 
function Z() { 
var g = new U(new Date()); 
a(g); 
b(g); 
Q.init(g); 
N.draw(); 
Y.style.visibility = "hidden" 
} 
function d(k, g) { 
for ( var j = 1901; j < 2050; j++) { 
var h = R("OPTION"); 
h.value = j; 
h.innerHTML = j; 
if (j == k) { 
h.selected = "selected" 
} 
C.appendChild(h) 
} 
for ( var j = 1; j < 13; j++) { 
var h = R("OPTION"); 
h.value = j; 
h.innerHTML = j; 
if (j == g) { 
h.selected = "selected" 
} 
X.appendChild(h) 
} 
C.onchange = f; 
X.onchange = f 
} 
function e(g) { 
d(g.solarYear, g.solarMonth); 
G.innerHTML = g.ganzhiYear; 
c.innerHTML = g.shengxiao; 
Y.onclick = Z; 
Y.style.visibility = "hidden" 
} 
return { 
init : function(g) { 
e(g) 
}, 
reset : function(g) { 
b(g) 
} 
} 
})(); 
var N = (function() { 
function C() { 
var Z = Q.getJson(); 
var c = Z.dateArray; 
M("cm").style.height = Z.lines * 38 + 2 + "px"; 
M("cm").innerHTML = ""; 
for ( var a = 0; a < c.length; a++) { 
if (c[a] == null) { 
continue 
} 
var X = R("DIV"); 
if (c[a].isToday) { 
X.style.border = "1px solid #a5b9da"; 
X.style.background = "#c1d9ff" 
} 
X.className = "cell"; 
X.style.left = (a % 7) * 60 + "px"; 
X.style.top = Math.floor(a / 7) * 38 + 2 + "px"; 
var b = R("DIV"); 
b.className = "so"; 
// http://www.CsrCode.Cn 
b.style.color = ((a % 7) > 4 || c[a].isRest) ? "#c60b02" 
: "#313131"; 
b.innerHTML = c[a].solarDate; 
X.appendChild(b); 
var Y = R("DIV"); 
Y.style.color = "#666"; 
Y.innerHTML = c[a].showInLunar; 
X.appendChild(Y); 
X.onmouseover = (function(d) { 
return function(f) { 
F.show({ 
dateIndex : d, 
cell : this 
}) 
} 
})(a); 
X.onmouseout = function() { 
F.hide() 
}; 
M("cm").appendChild(X) 
} 
var G = R("DIV"); 
G.id = "fd"; 
M("cm").appendChild(G); 
F.init(G) 
} 
return { 
draw : function(G) { 
C(G) 
} 
} 
})(); 
var F = (function() { 
var C; 
function Y(e, c) { 
if (arguments.length > 1) { 
var b = /([.*+?^=!:${}()|[/]////])/g, Z = "{".replace(b, 
"//$1"), d = "}".replace(b, "//$1"); 
var a = new RegExp("#" + Z + "([^" + Z + d + "]+)" + d, "g"); 
if (typeof (c) == "object") { 
return e.replace(a, function(f, h) { 
var g = c[h]; 
return typeof (g) == "undefined" ? "" : g 
}) 
} 
} 
return e 
} 
function G(b) { 
var a = Q.getJson().dateArray[b.dateIndex]; 
var Z = b.cell; 
var c = "#{solarYear} 年 #{solarMonth} 月 #{solarDate} 日 #{solarWeekDayInChinese}"; 
c += "<br><b>农历 #{lunarMonthInChinese}月#{lunarDateInChinese}</b>"; 
c += "<br>#{ganzhiYear}年 #{ganzhiMonth}月 #{ganzhiDate}日"; 
if (a.solarFestival != "" || a.lunarFestival != "" 
|| a.jieqi != "") { 
c += "<br><b>#{lunarFestival} #{solarFestival} #{jieqi}</b>" 
} 
C.innerHTML = Y(c, a); 
C.style.top = Z.offsetTop + Z.offsetHeight - 5 + "px"; 
C.style.left = Z.offsetLeft + Z.offsetWidth - 5 + "px"; 
C.style.display = "block" 
} 
function X() { 
C.style.display = "none" 
} 
return { 
show : function(Z) { 
G(Z) 
}, 
hide : function() { 
X() 
}, 
init : function(Z) { 
C = Z 
} 
} 
})(); 
var A = new U(new Date()); 
if (S) { 
window.attachEvent("onload", function() { 
W.reset(A) 
}) 
} 
W.init(A); 
Q.init(A); 
N.draw(); 
})(); 
//--> 
</script>

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/10002.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论