公历和农历转换的JS代码

<!--
function CalConv(M)
 {
 
 FIRSTYEAR = 1936;
 LASTYEAR = 2031;

 LunarCal = [
  new tagLunarCal(2332171001001101110 ), /* 1936 */ 
  new tagLunarCal( 4104231001001011101 ), 
  new tagLunarCal( 3075281100100101101 ), 
  new tagLunarCal( 4906331100100101011 ), 
  new tagLunarCal( 3800381101010010101 ), /* 1940 */ 
  new tagLunarCal( 2662441101101001010 ), 
  new tagLunarCal( 4503491011010101010 ), 
  new tagLunarCal( 3504540101011010101 ), 
  new tagLunarCal( 2445591010101011011 ), /* 1944 */ 
  new tagLunarCal( 430050010010111011 ), 
  new tagLunarCal( 3201101001001011011 ), 
  new tagLunarCal( 2122151100100101011 ), 
  new tagLunarCal( 4003201010100101011 ), /* 1948 */ 
  new tagLunarCal( 2875261011010010101 ), 
  new tagLunarCal( 4706310110110010101 ), 
  new tagLunarCal( 3600361011010101010 ), 
  new tagLunarCal( 2651410101010110101 ), /* 1952 */ 
  new tagLunarCal( 4403470100110110101 ), 
  new tagLunarCal( 3304521010010110110 ), 
  new tagLunarCal( 2335570101001010111 ), 
  new tagLunarCal( 420620101001010111 ), /* 1956 */ 
  new tagLunarCal( 308181010100101010 ), 
  new tagLunarCal( 4802131110100101010 ), 
  new tagLunarCal( 3803180110101010101 ), 
  new tagLunarCal( 2764231010110101010 ), /* 1960 */ 
  new tagLunarCal( 4506291010101101010 ), 
  new tagLunarCal( 3500340100101101101 ), 
  new tagLunarCal( 2441391010010101110 ), 
  new tagLunarCal( 4302441010010101110 ), /* 1964 */ 
  new tagLunarCal( 3204500101001001101 ), 
  new tagLunarCal( 2035551110100100110 ), 
  new tagLunarCal( 390601101100101010 ), 
  new tagLunarCal( 297050101101010101 ), /* 1968 */ 
  new tagLunarCal( 4702110101011010101 ), 
  new tagLunarCal( 3603161001011011010 ), 
  new tagLunarCal( 2654210100101011101 ), 
  new tagLunarCal( 4505260100101011011 ), /* 1972 */ 
  new tagLunarCal( 3300321010010011011 ), 
  new tagLunarCal( 2241371101001001101 ), 
  new tagLunarCal( 4102421101001001011 ), 
  new tagLunarCal( 3083471101010100101 ), /* 1976 */ 
  new tagLunarCal( 4805531011010101001 ), 
  new tagLunarCal( 3706581011011010101 ), 
  new tagLunarCal( 276031001011011010 ), 
  new tagLunarCal( 460181001010110110 ), /* 1980 */ 
  new tagLunarCal( 3503140100100110111 ), 
  new tagLunarCal( 2444191010010010111 ), 
  new tagLunarCal( 4305241010010010111 ), 
  new tagLunarCal( 32106291011001001011 ), /* 1984 */ 
  new tagLunarCal( 5001350110101001010 ), 
  new tagLunarCal( 3902400110110101001 ), 
  new tagLunarCal( 2863451010110110100 ), 
  new tagLunarCal( 4704501010101101101 ), /* 1988 */ 
  new tagLunarCal( 3606561001001101110 ), 
  new tagLunarCal( 265010100100101111 ), 
  new tagLunarCal( 450160100100101110 ), 
  new tagLunarCal( 3402110110010010110 ), /* 1992 */ 
  new tagLunarCal( 2234170110101001010 ), 
  new tagLunarCal( 4005221110101001010 ), 
  new tagLunarCal( 3086270110101100101 ), 
  new tagLunarCal( 4900320101101011001 ), /* 1996 */ 
  new tagLunarCal( 3702381010101101101 ), 
  new tagLunarCal( 2753431001001101101 ), 
  new tagLunarCal( 46,  04481001001011101 ), /* 1999 */
  new tagLunarCal( 35,  05531100100101101 ), /* 2000 */
  new tagLunarCal( 23,  40591101010010101 ),
  new tagLunarCal( 42,  01,  41101010010101 ),
  new tagLunarCal( 31,  02,  91101101001010 ),
  new tagLunarCal( 21,  23140101101010101 ), /* 2004 */
  new tagLunarCal( 39,  05200101011010101 ),
  new tagLunarCal( 28,  76251010101011011 ),
  new tagLunarCal( 48,  00300010010111011 ),
  new tagLunarCal( 37,  01351001001011011 ), /* 2008 */
  new tagLunarCal( 25,  53411100100101011 ),
  new tagLunarCal( 44,  04461010100101011 ),
  new tagLunarCal( 33,  05511011010010101 ),
  new tagLunarCal( 22,  46561011010101010 ), /* 2012 */
  new tagLunarCal( 40,  01,  21011010101010 ),
  new tagLunarCal( 30,  92,  70101010110101 ),
  new tagLunarCal( 49,  03120100101110101 ),
  new tagLunarCal( 38,  04171010010110110 ), /* 2016 */
  new tagLunarCal( 27,  66230101001010111 ),
  new tagLunarCal( 46,  00280101001010110 ),
  new tagLunarCal( 35,  01330110100100110 ),
  new tagLunarCal( 24,  42380111010010101 ), /* 2020 */
  new tagLunarCal( 42,  04440110101010101 ),
  new tagLunarCal( 31,  05491010110101010 ),
  new tagLunarCal( 21,  26540101010110101 ),
  new tagLunarCal( 40,  00590100101101101 ), /* 2024 */
  new tagLunarCal( 28,  62,  51010010101110 ),
  new tagLunarCal( 47,  03101010010011101 ),
  new tagLunarCal( 36,  04151101001001101 ),
  new tagLunarCal( 25,  55201110100100110 ), /* 2028 */
  new tagLunarCal( 43,  00261101010100101 ),
  new tagLunarCal( 32,  01311101101010100 ),
  new tagLunarCal( 22,  32360110101101010 ) ];


 /* 西曆年每月之日數 */
 SolarCal = [ 312831303130313130313031 ];

 /* 西曆年每月之累積日數, 平年與閏年 */
 SolarDays = [
  0315990120151181212243273304334365396,
  0316091121152182213244274305335366397 ];

 AnimalIdx = ["馬 ""羊 ""猴 ""雞 ""狗 ""豬 ""鼠 ""牛 ""虎 ""兔 ""龍 ""蛇 " ];
 LocationIdx = [ """""""西" ];
 
 
if (M==0) {  //阳历到阴历
if (!IsInteger(form_jisuan.yyear.value) || !IsInteger(form_jisuan.ymonth.value) || !IsInteger(form_jisuan.yday.value)) return alert("请输入合法阳历年月日数值");   
 SolarYear = parseInt(form_jisuan.yyear.value);
 SolarMonth = parseInt(form_jisuan.ymonth.value);
 SolarDate = parseInt(form_jisuan.yday.value);


 if ( SolarYear <= FIRSTYEAR || SolarYear > LASTYEAR ) return alert("请输入1936-2031有效年份"); 

 sm = SolarMonth - 1;
 
 if ( sm < 0 || sm > 11 ) return alert("请输入有效月份");
 
 leap = GetLeap( SolarYear );

 if ( sm == 1 )
  d = leap + 28;
 else
  d = SolarCal[sm];

 if ( SolarDate < 1 || SolarDate > d ) return 3;

 y = SolarYear - FIRSTYEAR;
 acc = SolarDays[ leap*14 + sm ] + SolarDate;
 kc = acc + LunarCal[y].BaseKanChih;
 Kan = kc % 10;
 Chih = kc % 12;
 Location = LocationIdx[kc % 4];
 Age = kc % 60;
 if ( Age < 22 )
  Age = 22 - Age;
 else
  Age = 82 - Age;

 Age =Age + 3;

if (Age < 10)
  Age=Age+60;

 Animal = AnimalIdx[ Chih ];

 if ( acc <= LunarCal[y].BaseDays ) {
  y--;
  LunarYear = SolarYear - 1;
  leap = GetLeap( LunarYear );
  sm += 12;
  acc = SolarDays[leap*14 + sm] + SolarDate;
  }
 else
  LunarYear = SolarYear;
  
 l1 = LunarCal[y].BaseDays;
 for ( i=0; i<13; i++ ) {
  l2 = l1 + LunarCal[y].MonthDays[i] + 29;
  if ( acc <= l2 ) break;
  l1 = l2;
  }

 LunarMonth = i + 1;
 LunarDate = acc - l1;
 im = LunarCal[y].Intercalation;

 if ( im != 0 && LunarMonth > im ) {
  LunarMonth--;
  if ( LunarMonth == im ) LunarMonth = -im;
  }

 if ( LunarMonth > 12 ) LunarMonth -= 12;

    //alert("农历/阴历日期为:"+ LunarYear + "年" + LunarMonth + "月" + LunarDate + "日" );

    var showgn = 0;
    showgn = "农历(阴历)日期为:"+ LunarYear + "" + LunarMonth + "" + LunarDate + "";
    document.form_jisuan.g2n.value=showgn;
            //form_jisuan.yyear.value = "";
            
//form_jisuan.ymonth.value = "";
            
//form_jisuan.yday.value = ""; 
 return 0;
 }

 else /* 阴历转阳历 */ 
 { 
   if (!IsInteger(form_jisuan.nyear.value) || !IsInteger(form_jisuan.nmonth.value) || !IsInteger(form_jisuan.nday.value)) return alert("请输入合法农历年月日数值");   
   LunarYear = parseInt(form_jisuan.nyear.value);
   LunarMonth = parseInt(form_jisuan.nmonth.value);
   LunarDate = parseInt(form_jisuan.nday.value);

        if ( LunarYear < FIRSTYEAR || LunarYear >= LASTYEAR ) return alert("请输入1936-2031有效年份");   
          
        y = LunarYear - FIRSTYEAR ; 
        im = LunarCal[y].Intercalation; 
        lm = LunarMonth; 
          
        if ( lm < 0 ) 
        { 
            if ( lm != -im ) 
                return alert("请输入有效月份");   
        } 
        else if ( lm < 1 || lm > 12 ) return alert("请输入有效月份");   
        
        if ( im != 0 ) 
        { 
            if ( lm > im ) 
                lm++; 
            else if ( lm == -im ) 
                lm = im + 1
        } 
        lm--; 

        if ( LunarDate > LunarCal[y].MonthDays[lm] + 29 ) 
            return alert("农历日期不正确");
           
        
        acc = 0;
        for ( i=0; i < lm;i++) {

         acc+= LunarCal[y].MonthDays[i] + 29;
          
         
       }
       
        acc +=LunarCal[y].BaseDays + LunarDate;
           
        
             
            leap = GetLeap( LunarYear ); 
            
            
        for ( i=13; i>=0; i-- ) {
        
            if ( acc > SolarDays[leap*14+i] ) 
                break
        }       
             SolarDate = acc - SolarDays[leap*14 + i]  ;
            
            
           
            if ( i <= 11 ) 
            { 
              
                SolarYear = LunarYear; 
                SolarMonth = i + 1
            } 
            else 
            { 
                
                SolarYear = LunarYear + 1
                SolarMonth = i - 11
            } 
             
         
            leap = GetLeap( SolarYear ); 
            y = SolarYear - FIRSTYEAR; 
            
            //acc = SolarDays[leap][SolarMonth-1] + SolarDate; 
            acc = SolarDays[leap*14 + SolarMonth-1] + SolarDate;
            
            weekday = ( acc + LunarCal[y].BaseWeekday ) % 7
            kc = acc + LunarCal[y].BaseKanChih; 
            kan = kc % 10
            chih = kc % 12
           
            //alert("公历/阳历日期为:"+ SolarYear + "年" + SolarMonth + "月" + SolarDate + "日" );        

    var showng = 0;
    showng = "公历(阳历)日期为:"+ SolarYear + "" + SolarMonth + "" + SolarDate + "";
    document.form_jisuan.n2g.value=showng;
 
            //form_jisuan.nyear.value = "";
            
//form_jisuan.nmonth.value = "";
            
//form_jisuan.nday.value = "";            
            return 0;
 }//else结束
 
 }

 /* 闰年, 返回 0 平年, 1 闰年 */
function GetLeap( year )
 {
   if ( year % 400 == 0 )
     return 1;
   else if ( year % 100 == 0 )
     return 0;
   else if ( year % 4 == 0 )
     return 1;
   else
     return 0;
 }

function tagLunarCal( d, i, w, k, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13) {
 this.BaseDays = d;         /* 1 月 1 日到正月初一的累计日 */
 this.Intercalation = i;    /* 闰月月份. 0==此年沒有闰月 */
 this.BaseWeekday = w;      /* 此年 1 月 1 日为星期减 1 */
 this.BaseKanChih = k;      /* 此年 1 月 1 日之干支序号减 1 */
 this.MonthDays = [ m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13 ]; /* 此农历年每月之大小, 0==小月(29日), 1==大月(30日) */
}

//-->


<!--
function OpenWin( url ) { 
 return window.open( url, 'coop''width=320,height=350,toolbar=0,location=0,directories=0,status=0,menuBar=0,scrollBars=0,resizable=1' ); 



function IsInteger(string ,sign) 
{  
  var integer; 
  if ((sign!=null) && (sign!='-') && (sign!='+')) 
  { 
   alert('IsInter(string,sign)的参数出错:nsign为null或"-"或"+"'); 
   return false
  } 
  integer = parseInt(string); 
  if (isNaN(integer)) 
  { 
   return false
  } 
  else if (integer.toString().length==string.length) 
  {  
   if ((sign==null) || (sign=='-' && integer<0) || (sign=='+' && integer>0)) 
   { 
     return true
   } 
   else 
     return false;  
  } 
  else 
   return false


//-->

调用方式

<label>请选择阳历日期</label>

<select size="1" name="yyear" class="select">
<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 value="2015" selected="selected">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></select>年

<select size="1" name="ymonth" class="select">
<option value="1">1</option><option value="2">2</option><option 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>月

<select size="1" name="yday" class="select">
<option value="1">1</option><option value="2">2</option><option 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><option value="13">13</option><option value="14">14</option><option value="15">15</option><option value="16">16</option><option value="17">17</option><option value="18">18</option><option value="19">19</option><option value="20" selected="selected">20</option><option value="21">21</option><option value="22">22</option><option value="23">23</option><option value="24">24</option><option value="25">25</option><option value="26">26</option><option value="27">27</option><option value="28">28</option><option value="29">29</option><option value="30">30</option><option value="31">31</option></select> 日

<input onclick="CalConv(0)" class="button" type="button" value="阳历转阴历">
原文地址:https://www.cnblogs.com/cf924823/p/5150914.html