The following JS class is re-designed using the object-oriented idea, making queries today faster than the day of the lunar calendar.
Function chinesecalendar (dateobj ){
This. dateobj = (dateobj! = Undefined )? Dateobj: new date ();
This. Sy = This. dateobj. getfullyear ();
This. Sm = This. dateobj. getmonth ();
This. SD = This. dateobj. getdate ();
This. lunarinfo = [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, 0x0a5b0, 0x14573, 0x052b0, 0x0a9a8, 0x0e950, 0x06aa0,
0x0aea6, 0x0ab50, 0x04b60, 0x0aae4, 0x0a570, 0x05260, 0x0f263, 0x0d950, 0x05b57, 0x056a0,
0x096d0, 0x04dd5, 0x04ad0, 0x0a4d0, 0x0d4d4, 0x0d250, 0x0d558, 0x0b540, 0x0b6a0, 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];
// Returns the month 1-12 in the Y-year period of the lunar calendar. If no value is returned, the return value is 0.
This. leapmonth = function (y ){
Return this. lunarinfo [Y-1900] & 0xf;
};
// Return the total number of days of the lunar month y
This. monthdays = function (Y, m ){
Return (this. lunarinfo [Y-1900] & (0x10000> m ))? 30: 29;
};
// Returns the number of days in the Y-year month of the Chinese calendar.
This. leapdays = function (y ){
If (this. leapmonth (y )){
Return (this. lunarinfo [Y-1900] & 0x10000 )? 30: 29;
}
Else {
Return 0;
}
};
// Returns the total number of days of the lunar y year.
This. lyeardays = function (y ){
VaR I, sum = 348;
For (I = 0x8000; I> 0x8; I >>= 1 ){
Sum + = (this. lunarinfo [Y-1900] & I )? 1: 0;
}
Return sum + this. leapdays (y );
};
// Calculate the lunar calendar, input the date object, and return the object of the lunar calendar date
// Attributes of this object include. year. Month. Day. isleap. yearcyl. daycyl. moncyl
This. Lunar = function (dateobj ){
VaR I, leap = 0, temp = 0, lunarobj = {};
VaR basedate = new date (1900, 0, 31 );
VaR offset = (dateobj-base date)/86400000;
Lunarobj. daycyl = offset + 40;
Lunarobj. moncyl = 14;
For (I = 1900; I <2050 & Offset> 0; I ++ ){
Temp = This. lyeardays (I );
Offset-= temp;
Lunarobj. moncyl + = 12;
}
If (offset <0 ){
Offset + = temp;
I --;
Lunarobj. moncyl-= 12;
}
Lunarobj. Year = I;
Lunarobj. yearcyl = I-1864;
Leap = This. leapmonth (I );
Lunarobj. isleap = false;
For (I = 1; I <13 & Offset> 0; I ++ ){
If (LEAP> 0 & I = (LEAP + 1) & lunarobj. isleap = false ){
-- I;
Lunarobj. isleap = true;
Temp = This. leapdays (lunarobj. year );
}
Else {
Temp = This. monthdays (lunarobj. Year, I)
}
If (lunarobj. isleap = true & I = (LEAP + 1 )){
Lunarobj. isleap = false;
}
Offset-= temp;
If (lunarobj. isleap = false ){
Lunarobj. moncyl ++;
}
}
If (offset = 0 & leap> 0 & I = leap + 1 ){
If (lunarobj. isleap ){
Lunarobj. isleap = false;
}
Else {
Lunarobj. isleap = true;
-- I;
-- Lunarobj. moncyl;
}
}
If (offset <0 ){
Offset + = temp;
-- I;
-- Lunarobj. moncyl
}
Lunarobj. month = I;
Lunarobj. Day = offset + 1;
Return lunarobj;
};
// Chinese Date
This. CDAY = function (M, d ){
VaR nstr1 = ['day', 'yi', '2', '3', '4', '5', '6', '7', '8 ', '9', '10'];
VaR nstr2 = ['chu', '10', 'hangzhou', 'hangzhou', ''];
VaR S;
If (M> 10 ){
S = '10' + nstr1 [M-10];
}
Else {
S = nstr1 [m];
}
S + = 'month ';
Switch (d ){
Case 10:
S + = '10 ';
Break;
Case 20:
S + = '20 ';
Break;
Case 30:
S + = '30 ';
Break;
Default:
S + = nstr2 [math. Floor (D/10)];
S + = nstr1 [d % 10];
}
Return S;
};
This. solarday2 = function (){
VaR sdobj = new date (this. Sy, this. Sm, this. SD );
VaR ldobj = This. Lunar (sdobj );
VaR TT = 'lunar calendar '+ this. CDAY (ldobj. Month, ldobj. Day );
Ldobj = NULL;
Return tt;
};
This. weekday = function (){
VaR day = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
Return day [This. dateobj. getday ()];
};
This. yymmdd = function (){
VaR datearr = [This. Sy, 'Year', this. sm + 1, 'month', this. SD, 'day'];
Return datearr. Join ('');
}
}
Usage:
<HTML>
<Head>
<Title>
Lunar Calendar Test
</Title>
<SCRIPT type = "text/JavaScript" src = "cc. js"> </SCRIPT>
</Head>
<Body>
<SCRIPT type = "text/JavaScript">
VaR date = new chinesecalendar ();
Document. Write ("Lunar calendar:" + date. solarday2 ());
Document. Write ("Week:" + date. weekday ());
Document. Write ("Date:" + date. yymmdd ());
</SCRIPT>
</Body>
</Html>