公历和农历转换的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 οnclick= " CalConv(0) "  class= " button " type= " button " value= " 阳历转阴历 ">

 

 

 

 

转载于:https://www.cnblogs.com/cf924823/p/5150914.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值