当前位置: 代码迷 >> Web前端 >> 阳历转换阴历
  详细解决方案

阳历转换阴历

热度:273   发布时间:2012-08-03 00:12:14.0
公历转换阴历
var DateConversion = (function() {  
    var constants = {  
        LUNARINFO : new Array(  
                /* 1900 */  
                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,/* 2049 */  
                // 下面的是从 2050 到 2100 年的  
                0x14b63, /* 2050 */  
                0x09370, 0x049f8, 0x04970, 0x064b0, 0x168a6, /* 2055 */  
                0x0ea50, 0x06b20, 0x1a6c4, 0x0aae0, 0x0a2e0, /* 2060 */  
                0x0d2e3, 0x0c960, 0x0d557, 0x0d4a0, 0x0da50, /* 2065 */  
                0x05d55, 0x056a0, 0x0a6d0, 0x055d4, 0x052d0, /* 2070 */  
                0x0a9b8, 0x0a950, 0x0a4a0, 0x0b6a6, 0x0ad50, /* 2075 */  
                0x055a0, 0x0aba0, 0x0a5b0, 0x052b0, 0x0b273, /* 2080 */  
                0x06930, 0x07337, 0x06aa0, 0x0ad50, 0x14b55, /* 2085 */  
                0x04b60, 0x0a570, 0x054e4, 0x0d260, 0x0e968, /* 2090 */  
                0x0d520, 0x0daa0, 0x16aa6, 0x056d0, 0x04ae0, /* 2095 */  
                0x0a9d4, 0x0a4d0, 0x0d150, 0x0f252, 0x0d520 /* 2100 */),  
        GAN : new Array("甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸"),  
        ZHI : new Array("子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌",  
                "亥")  
    };  
    var cd = function(strDate) {  
        var date, year, month, day, displayDay, displayMonth,result;  
        this.setDate = function(strDate) {  
            if (strDate) {  
                date = this.strToDate(strDate);  
            } else {  
                date = new Date();  
            }  
        };  
        this.getDate = function() {  
            return  date;   
        };  
        this.getResult = function(){  
            return result;  
        };  
        this.setDate(strDate);  
        var res =lunar(new Date(date.getFullYear(), date.getMonth()-1,date.getDate()));  
        var cl = '<font color="red" STYLE="font-size:9pt;">';  
        var tt = cyclical(res[0] - 1900 + 36) +'('+res[0] + ')年'+(res[1] ==true? '闰' : '')
                + cDay(res[2], res[3]);  
         result =cl + tt + '</font>';  
    };  
    cd.getConstant = function(name) {  
        return constants[name];  
    };  
    // ==== 传入 offset 传回干支, 0=甲子  
    function cyclical(num) {  
        return (DateConversion.getConstant('GAN')[num % 10] + DateConversion  
                .getConstant('ZHI')[num % 12]);  
    };  
    // ==== 传回农历 y年的总天数  
    function lYearDays(y) {  
        var i, sum = 348;  
        for (i = 0x8000; i > 0x8; i >>= 1)  
            sum += (DateConversion.getConstant('LUNARINFO')[y - 1900] & i)  
                    ? 1  
                    : 0;  
        return (sum + leapDays(y));  
    };  
    // ==== 传回农历 y年闰月的天数  
    function leapDays(y) {  
        if (leapMonth(y))  
            return ((DateConversion.getConstant('LUNARINFO')[y - 1900] & 0x10000)  
                    ? 30  
                    : 29);  
        else  
            return (0);  
    };  
    // ==== 传回农历 y年闰哪个月 1-12 , 没闰传回 0  
    function leapMonth(y) {  
        return (DateConversion.getConstant('LUNARINFO')[y - 1900] & 0xf);  
    };  
    // ====================================== 传回农历 y年m月的总天数  
    function monthDays(y, m) {  
        return (DateConversion.getConstant('LUNARINFO')[y - 1900] & (0x10000 >> m))  
                ? 30  
                : 29;  
    };  
    // ==== 中文日期  
    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);  
    };  
    // ==== 算出农历, 传入日期物件, 传回农历日期物件  
    // ==== 该物件属性有 .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;  
        var monCyl = 14;  
  
        for (i = 1900; i < 2050 && offset > 0; i++) {  
            temp = lYearDays(i);  
            offset -= temp;  
            monCyl += 12;  
        }  
        if (offset < 0) {  
            offset += temp;  
            i--;  
            monCyl -= 12;  
        }  
  
        var year = i;  
        // this.yearCyl = i - 1864;  
  
        leap = leapMonth(i); // 闰哪个月  
        var isLeap = false;  
  
        for (i = 1; i < 13 && offset > 0; i++) {  
            // 闰月  
            if (leap > 0 && i == (leap + 1) && isLeap == false) {  
                --i;  
                isLeap = true;  
                temp = leapDays(year);  
            } else {  
                temp = monthDays(year, i);  
            }  
  
            // 解除闰月  
            if (isLeap == true && i == (leap + 1)) {  
                isLeap = false;  
            }  
  
            offset -= temp;  
            if (isLeap == false) {  
                monCyl++;  
            }  
        }  
  
        if (offset == 0 && leap > 0 && i == leap + 1) {  
            if (isLeap) {  
                isLeap = false;  
            } else {  
                isLeap = true;  
                --i;  
                --monCyl;  
            }  
        }  
  
        if (offset < 0) {  
            offset += temp;  
            --i;  
            --monCyl;  
        }  
		//年(闰)月日
        return [year,isLeap,i,offset + 1];  
    }  
    return cd;  
})();  
  
DateConversion.prototype = {  
    strToDate : function(str) {  
        var arys = new Array();  
        arys = str.split('-');  
        var newDate = new Date(arys[0], arys[1], arys[2]);  
        return newDate;  
    }  
};  

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>农历日期显示</title>
    <meta http-equiv="content-type" content="text/html; charset=gbk">
<script type="text/javascript" src='dateConversion.js' ></script>
<script>
// 显示当前时间
function setCalendar() {
	var obj =  new DateConversion(document.getElementById('sdc').value);
	document.getElementById('dc').innerHTML=obj.getResult();
}
</script>
<!--结束-->
  </head>
  <body>
	<div id='dc'></div>
    <input type='text' id='sdc' value='1988-02-02'></input>
	<input type='button' onclick='setCalendar()' value='Date Conversion'/>
  </body>
</html>
  相关解决方案