万年历(显示农历)

         以前看同学在单片机上搞万年历,我觉得蛮实用的,想看看。公历好说,简直不要太简单,判断闰年的一句 if(year%4==0 && (year%100!=0) || year%400==0)就over了。但农历就非常麻烦。农历的二十四节气能知道农业生产,而且是根据月亮的晦朔来的,完全没规律可言,或者说在那几天波动,闰月也没公历方便。百度了很久也没发现道理。最后看别人的例子,农历的信息全都在一个数组里,一般都可用到2100年,全都是天文台观测好了的。到用了差不多的时候,会继续观测。

         这里给一个可以用的html代码和有注释的js.网上搜到的时候都是经过压缩的,从别的网站搞来个优化美化css、js和html的工具,很好用。

<html>

<head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <title>日历,值得一看</title>
</head>

<body>
    <table id="1" cellpadding="0" cellspacing="0">
        <tbody>
            <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>
                                <option value="1901">1901</option>
                                <option value="1902">1902</option>
                                <option value="1903">1903</option>
                                <option value="1904">1904</option>
                                <option value="1905">1905</option>
                                <option value="1906">1906</option>
                                <option value="1907">1907</option>
                                <option value="1908">1908</option>
                                <option value="1909">1909</option>
                                <option value="1910">1910</option>
                                <option value="1911">1911</option>
                                <option value="1912">1912</option>
                                <option value="1913">1913</option>
                                <option value="1914">1914</option>
                                <option value="1915">1915</option>
                                <option value="1916">1916</option>
                                <option value="1917">1917</option>
                                <option value="1918">1918</option>
                                <option value="1919">1919</option>
                                <option value="1920">1920</option>
                                <option value="1921">1921</option>
                                <option value="1922">1922</option>
                                <option value="1923">1923</option>
                                <option value="1924">1924</option>
                                <option value="1925">1925</option>
                                <option value="1926">1926</option>
                                <option value="1927">1927</option>
                                <option value="1928">1928</option>
                                <option value="1929">1929</option>
                                <option value="1930">1930</option>
                                <option value="1931">1931</option>
                                <option value="1932">1932</option>
                                <option value="1933">1933</option>
                                <option value="1934">1934</option>
                                <option value="1935">1935</option>
                                <option value="1936">1936</option>
                                <option value="1937">1937</option>
                                <option value="1938">1938</option>
                                <option value="1939">1939</option>
                                <option value="1940">1940</option>
                                <option value="1941">1941</option>
                                <option value="1942">1942</option>
                                <option value="1943">1943</option>
                                <option value="1944">1944</option>
                                <option value="1945">1945</option>
                                <option value="1946">1946</option>
                                <option value="1947">1947</option>
                                <option value="1948">1948</option>
                                <option value="1949">1949</option>
                                <option value="1950">1950</option>
                                <option value="1951">1951</option>
                                <option value="1952">1952</option>
                                <option value="1953">1953</option>
                                <option value="1954">1954</option>
                                <option value="1955">1955</option>
                                <option value="1956">1956</option>
                                <option value="1957">1957</option>
                                <option value="1958">1958</option>
                                <option value="1959">1959</option>
                                <option value="1960">1960</option>
                                <option value="1961">1961</option>
                                <option value="1962">1962</option>
                                <option value="1963">1963</option>
                                <option value="1964">1964</option>
                                <option value="1965">1965</option>
                                <option value="1966">1966</option>
                                <option value="1967">1967</option>
                                <option value="1968">1968</option>
                                <option value="1969">1969</option>
                                <option value="1970">1970</option>
                                <option value="1971">1971</option>
                                <option value="1972">1972</option>
                                <option value="1973">1973</option>
                                <option value="1974">1974</option>
                                <option value="1975">1975</option>
                                <option value="1976">1976</option>
                                <option value="1977">1977</option>
                                <option value="1978">1978</option>
                                <option value="1979">1979</option>
                                <option value="1980">1980</option>
                                <option value="1981">1981</option>
                                <option value="1982">1982</option>
                                <option value="1983">1983</option>
                                <option value="1984">1984</option>
                                <option value="1985">1985</option>
                                <option value="1986">1986</option>
                                <option value="1987">1987</option>
                                <option value="1988">1988</option>
                                <option value="1989">1989</option>
                                <option value="1990">1990</option>
                                <option value="1991">1991</option>
                                <option value="1992">1992</option>
                                <option value="1993">1993</option>
                                <option value="1994">1994</option>
                                <option value="1995">1995</option>
                                <option value="1996">1996</option>
                                <option value="1997">1997</option>
                                <option value="1998">1998</option>
                                <option value="1999">1999</option>
                                <option value="2000">2000</option>
                                <option value="2001">2001</option>
                                <option value="2002">2002</option>
                                <option value="2003">2003</option>
                                <option value="2004">2004</option>
                                <option value="2005">2005</option>
                                <option value="2006">2006</option>
                                <option value="2007">2007</option>
                                <option value="2008">2008</option>
                                <option value="2009">2009</option>
                                <option value="2010">2010</option>
                                <option value="2011">2011</option>
                                <option value="2012">2012</option>
                                <option value="2013">2013</option>
                                <option value="2014">2014</option>
                                <option selected="selected" value="2015">2015</option>
                                <option value="2016">2016</option>
                                <option value="2017">2017</option>
                                <option value="2018">2018</option>
                                <option value="2019">2019</option>
                                <option value="2020">2020</option>
                                <option value="2021">2021</option>
                                <option value="2022">2022</option>
                                <option value="2023">2023</option>
                                <option value="2024">2024</option>
                                <option value="2025">2025</option>
                                <option value="2026">2026</option>
                                <option value="2027">2027</option>
                                <option value="2028">2028</option>
                                <option value="2029">2029</option>
                                <option value="2030">2030</option>
                                <option value="2031">2031</option>
                                <option value="2032">2032</option>
                                <option value="2033">2033</option>
                                <option value="2034">2034</option>
                                <option value="2035">2035</option>
                                <option value="2036">2036</option>
                                <option value="2037">2037</option>
                                <option value="2038">2038</option>
                                <option value="2039">2039</option>
                                <option value="2040">2040</option>
                                <option value="2041">2041</option>
                                <option value="2042">2042</option>
                                <option value="2043">2043</option>
                                <option value="2044">2044</option>
                                <option value="2045">2045</option>
                                <option value="2046">2046</option>
                                <option value="2047">2047</option>
                                <option value="2048">2048</option>
                                <option value="2049">2049</option>
                            </select>
                             年 
                            <select>
                                <option value="1">1</option>
                                <option value="2">2</option>
                                <option selected="selected" value="3">3</option>
                                <option value="4">4</option>
                                <option value="5">5</option>
                                <option value="6">6</option>
                                <option value="7">7</option>
                                <option value="8">8</option>
                                <option value="9">9</option>
                                <option value="10">10</option>
                                <option value="11">11</option>
                                <option value="12">12</option>
                            </select>
                             月    农历<span>乙未</span>年 [ <span>羊</span>年 ]      
                            <input value="回到今天" title="点击后跳转回今天" style="padding: 0px; visibility: hidden;" type="button">
                        </div>
                        <ul id="wk">
                            <li>一</li>
                            <li>二</li>
                            <li>三</li>
                            <li>四</li>
                            <li>五</li>
                            <li><b>六</b></li>
                            <li><b>日</b></li>
                        </ul>
                        <div style="height: 230px;" id="cm">
                            <div style="left: 360px; top: 2px;" class="cell">
                                <div style="color: rgb(198, 11, 2);" class="so">1</div>
                                <div style="color: rgb(102, 102, 102);">十一</div>
                            </div>
                            <div style="left: 0px; top: 40px;" class="cell">
                                <div style="color: rgb(49, 49, 49);" class="so">2</div>
                                <div style="color: rgb(102, 102, 102);">十二</div>
                            </div>
                            <div style="left: 60px; top: 40px;" class="cell">
                                <div style="color: rgb(49, 49, 49);" class="so">3</div>
                                <div style="color: rgb(102, 102, 102);">十三</div>
                            </div>
                            <div style="left: 120px; top: 40px;" class="cell">
                                <div style="color: rgb(49, 49, 49);" class="so">4</div>
                                <div style="color: rgb(102, 102, 102);">十四</div>
                            </div>
                            <div style="left: 180px; top: 40px;" class="cell">
                                <div style="color: rgb(49, 49, 49);" class="so">5</div>
                                <div style="color: rgb(102, 102, 102);">元宵节</div>
                            </div>
                            <div style="left: 240px; top: 40px;" class="cell">
                                <div style="color: rgb(49, 49, 49);" class="so">6</div>
                                <div style="color: rgb(102, 102, 102);">惊蛰</div>
                            </div>
                            <div style="left: 300px; top: 40px;" class="cell">
                                <div style="color: rgb(198, 11, 2);" class="so">7</div>
                                <div style="color: rgb(102, 102, 102);">十七</div>
                            </div>
                            <div style="left: 360px; top: 40px;" class="cell">
                                <div style="color: rgb(198, 11, 2);" class="so">8</div>
                                <div style="color: rgb(102, 102, 102);">妇女节</div>
                            </div>
                            <div style="left: 0px; top: 78px;" class="cell">
                                <div style="color: rgb(49, 49, 49);" class="so">9</div>
                                <div style="color: rgb(102, 102, 102);">十九</div>
                            </div>
                            <div style="left: 60px; top: 78px;" class="cell">
                                <div style="color: rgb(49, 49, 49);" class="so">10</div>
                                <div style="color: rgb(102, 102, 102);">二十</div>
                            </div>
                            <div style="left: 120px; top: 78px;" class="cell">
                                <div style="color: rgb(49, 49, 49);" class="so">11</div>
                                <div style="color: rgb(102, 102, 102);">廿一</div>
                            </div>
                            <div style="left: 180px; top: 78px;" class="cell">
                                <div style="color: rgb(49, 49, 49);" class="so">12</div>
                                <div style="color: rgb(102, 102, 102);">植树节</div>
                            </div>
                            <div style="left: 240px; top: 78px;" class="cell">
                                <div style="color: rgb(49, 49, 49);" class="so">13</div>
                                <div style="color: rgb(102, 102, 102);">廿三</div>
                            </div>
                            <div style="left: 300px; top: 78px;" class="cell">
                                <div style="color: rgb(198, 11, 2);" class="so">14</div>
                                <div style="color: rgb(102, 102, 102);">廿四</div>
                            </div>
                            <div style="left: 360px; top: 78px;" class="cell">
                                <div style="color: rgb(198, 11, 2);" class="so">15</div>
                                <div style="color: rgb(102, 102, 102);">消费...</div>
                            </div>
                            <div style="left: 0px; top: 116px;" class="cell">
                                <div style="color: rgb(49, 49, 49);" class="so">16</div>
                                <div style="color: rgb(102, 102, 102);">廿六</div>
                            </div>
                            <div style="left: 60px; top: 116px;" class="cell">
                                <div style="color: rgb(49, 49, 49);" class="so">17</div>
                                <div style="color: rgb(102, 102, 102);">廿七</div>
                            </div>
                            <div style="left: 120px; top: 116px;" class="cell">
                                <div style="color: rgb(49, 49, 49);" class="so">18</div>
                                <div style="color: rgb(102, 102, 102);">廿八</div>
                            </div>
                            <div class="cell" style="border: 1px solid rgb(165, 185, 218); background: none repeat scroll 0% 0% rgb(193, 217, 255); left: 180px; top: 116px;">
                                <div style="color: rgb(49, 49, 49);" class="so">19</div>
                                <div style="color: rgb(102, 102, 102);">廿九</div>
                            </div>
                            <div style="left: 240px; top: 116px;" class="cell">
                                <div style="color: rgb(49, 49, 49);" class="so">20</div>
                                <div style="color: rgb(102, 102, 102);">二月</div>
                            </div>
                            <div style="left: 300px; top: 116px;" class="cell">
                                <div style="color: rgb(198, 11, 2);" class="so">21</div>
                                <div style="color: rgb(102, 102, 102);">春分</div>
                            </div>
                            <div style="left: 360px; top: 116px;" class="cell">
                                <div style="color: rgb(198, 11, 2);" class="so">22</div>
                                <div style="color: rgb(102, 102, 102);">初三</div>
                            </div>
                            <div style="left: 0px; top: 154px;" class="cell">
                                <div style="color: rgb(49, 49, 49);" class="so">23</div>
                                <div style="color: rgb(102, 102, 102);">初四</div>
                            </div>
                            <div style="left: 60px; top: 154px;" class="cell">
                                <div style="color: rgb(49, 49, 49);" class="so">24</div>
                                <div style="color: rgb(102, 102, 102);">初五</div>
                            </div>
                            <div style="left: 120px; top: 154px;" class="cell">
                                <div style="color: rgb(49, 49, 49);" class="so">25</div>
                                <div style="color: rgb(102, 102, 102);">初六</div>
                            </div>
                            <div style="left: 180px; top: 154px;" class="cell">
                                <div style="color: rgb(49, 49, 49);" class="so">26</div>
                                <div style="color: rgb(102, 102, 102);">初七</div>
                            </div>
                            <div style="left: 240px; top: 154px;" class="cell">
                                <div style="color: rgb(49, 49, 49);" class="so">27</div>
                                <div style="color: rgb(102, 102, 102);">初八</div>
                            </div>
                            <div style="left: 300px; top: 154px;" class="cell">
                                <div style="color: rgb(198, 11, 2);" class="so">28</div>
                                <div style="color: rgb(102, 102, 102);">初九</div>
                            </div>
                            <div style="left: 360px; top: 154px;" class="cell">
                                <div style="color: rgb(198, 11, 2);" class="so">29</div>
                                <div style="color: rgb(102, 102, 102);">初十</div>
                            </div>
                            <div style="left: 0px; top: 192px;" class="cell">
                                <div style="color: rgb(49, 49, 49);" class="so">30</div>
                                <div style="color: rgb(102, 102, 102);">十一</div>
                            </div>
                            <div style="left: 60px; top: 192px;" class="cell">
                                <div style="color: rgb(49, 49, 49);" class="so">31</div>
                                <div style="color: rgb(102, 102, 102);">十二</div>
                            </div>
                            <div style="top: 33px; left: 406px; display: none;" id="fd">2015 年 3 月 1 日 星期日
                                <br><b>农历 正月十一</b>
                                <br>乙未年 戊寅月 丙子日</div>
                        </div>
                        <div id="bm"></div>
                    </div>
                </td>
            </tr>
        </tbody>
    </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";
                        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>
</body>

</html>

                                                               万年历(显示农历)_第1张图片


    然后是个有注释的js,最后三行是测试用的。

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 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 monthName = new Array("JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC");
/* ******** 日期计算  ****************/
//===== 传回农历   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;
}

//====== 传回国历   y年某m+1月的天数   
function solarDays(y, m) {
        if (m == 1)
            return (((y % 4 == 0) && (y % 100 != 0) || (y % 400 == 0)) ? 29 : 28);
        else
            return (solarMonth[m]);
    }
    //====== 传入   offset   传回干支,   0=甲子   

function cyclical(num) {
    return (Gan[num % 10] + Zhi[num % 12])
}

//====== 中文日期   
function cDay(d) {
        var 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 cMonth(m) {
    var s;
    switch (m) {
    case 1:
        s = '正月';
        break;
    case 2:
        s = '二月';
        break;
    case 3:
        s = '三月';
        break;
    case 4:
        s = '四月';
        break;
    case 5:
        s = '五月';
        break;
    case 6:
        s = '六月';
        break;
    case 7:
        s = '七月';
        break;
    case 8:
        s = '八月';
        break;
    case 9:
        s = '九月';
        break;
    case 10:
        s = '十月';
        break;
    case 11:
        s = '十一月';
        break;
    case 12:
        s = '十二月';
        break;
    default:
        break;
    }
    return (s);
}

function GetLunarDay(YearStr, MonthStr, DayStr) {
    var sDObj = new Date(parseInt(YearStr), parseInt(MonthStr) - 1, parseInt(DayStr))
    var lDObj = new Lunar(sDObj); //农历
    console.log(cMonth(lDObj.month) + cDay(lDObj.day));
    return cMonth(lDObj.month) + cDay(lDObj.day);
    //整型数组
    //var ss=[lDObj.month,lDObj.day];
    //return ss;
}
var caladar = document.getElementById("caladar");
var str = GetLunarDay('2015', '3', '11'); //正月廿一
caladar.innerHTML = str;


你可能感兴趣的:(JavaScript,日历,农历,万年历)