农历日期控件解决方案

在开发短信发送系统的时候,碰到这样的问题,给指定客户发送生日短信,但是很多客户使用农历生日,所以找了一些资料如下。
1、数据库方面
先建立农历日期数据库
   CREATE     TABLE    SolarData   
  (   
          yearId   
int     not     null ,   
          data   
char ( 7 )    not     null ,   
          dataInt   
int     not     null    
  )   
  
-- 插入数据   
   INSERT     INTO      
  SolarData   
SELECT     1900 , ' 0x04bd8 ' , 19416     UNION     ALL     SELECT     1901 , ' 0x04ae0 ' , 19168    
  
UNION     ALL     SELECT     1902 , ' 0x0a570 ' , 42352     UNION     ALL     SELECT     1903 , ' 0x054d5 ' , 21717    
  
UNION     ALL     SELECT     1904 , ' 0x0d260 ' , 53856     UNION     ALL     SELECT     1905 , ' 0x0d950 ' , 55632    
  
UNION     ALL     SELECT     1906 , ' 0x16554 ' , 91476     UNION     ALL     SELECT     1907 , ' 0x056a0 ' , 22176    
  
UNION     ALL     SELECT     1908 , ' 0x09ad0 ' , 39632     UNION     ALL     SELECT     1909 , ' 0x055d2 ' , 21970    
  
UNION     ALL     SELECT     1910 , ' 0x04ae0 ' , 19168     UNION     ALL     SELECT     1911 , ' 0x0a5b6 ' , 42422    
  
UNION     ALL     SELECT     1912 , ' 0x0a4d0 ' , 42192     UNION     ALL     SELECT     1913 , ' 0x0d250 ' , 53840    
  
UNION     ALL     SELECT     1914 , ' 0x1d255 ' , 119381     UNION     ALL     SELECT     1915 , ' 0x0b540 ' , 46400    
  
UNION     ALL     SELECT     1916 , ' 0x0d6a0 ' , 54944     UNION     ALL     SELECT     1917 , ' 0x0ada2 ' , 44450    
  
UNION     ALL     SELECT     1918 , ' 0x095b0 ' , 38320     UNION     ALL     SELECT     1919 , ' 0x14977 ' , 84343    
  
UNION     ALL     SELECT     1920 , ' 0x04970 ' , 18800     UNION     ALL     SELECT     1921 , ' 0x0a4b0 ' , 42160    
  
UNION     ALL     SELECT     1922 , ' 0x0b4b5 ' , 46261     UNION     ALL     SELECT     1923 , ' 0x06a50 ' , 27216    
  
UNION     ALL     SELECT     1924 , ' 0x06d40 ' , 27968     UNION     ALL     SELECT     1925 , ' 0x1ab54 ' , 109396    
  
UNION     ALL     SELECT     1926 , ' 0x02b60 ' , 11104     UNION     ALL     SELECT     1927 , ' 0x09570 ' , 38256    
  
UNION     ALL     SELECT     1928 , ' 0x052f2 ' , 21234     UNION     ALL     SELECT     1929 , ' 0x04970 ' , 18800    
  
UNION     ALL     SELECT     1930 , ' 0x06566 ' , 25958     UNION     ALL     SELECT     1931 , ' 0x0d4a0 ' , 54432    
  
UNION     ALL     SELECT     1932 , ' 0x0ea50 ' , 59984     UNION     ALL     SELECT     1933 , ' 0x06e95 ' , 28309    
  
UNION     ALL     SELECT     1934 , ' 0x05ad0 ' , 23248     UNION     ALL     SELECT     1935 , ' 0x02b60 ' , 11104    
  
UNION     ALL     SELECT     1936 , ' 0x186e3 ' , 100067     UNION     ALL     SELECT     1937 , ' 0x092e0 ' , 37600    
  
UNION     ALL     SELECT     1938 , ' 0x1c8d7 ' , 116951     UNION     ALL     SELECT     1939 , ' 0x0c950 ' , 51536    
  
UNION     ALL     SELECT     1940 , ' 0x0d4a0 ' , 54432     UNION     ALL     SELECT     1941 , ' 0x1d8a6 ' , 120998    
  
UNION     ALL     SELECT     1942 , ' 0x0b550 ' , 46416     UNION     ALL     SELECT     1943 , ' 0x056a0 ' , 22176    
  
UNION     ALL     SELECT     1944 , ' 0x1a5b4 ' , 107956     UNION     ALL     SELECT     1945 , ' 0x025d0 ' , 9680    
  
UNION     ALL     SELECT     1946 , ' 0x092d0 ' , 37584     UNION     ALL     SELECT     1947 , ' 0x0d2b2 ' , 53938    
  
UNION     ALL     SELECT     1948 , ' 0x0a950 ' , 43344     UNION     ALL     SELECT     1949 , ' 0x0b557 ' , 46423    
  
UNION     ALL     SELECT     1950 , ' 0x06ca0 ' , 27808     UNION     ALL     SELECT     1951 , ' 0x0b550 ' , 46416    
  
UNION     ALL     SELECT     1952 , ' 0x15355 ' , 86869     UNION     ALL     SELECT     1953 , ' 0x04da0 ' , 19872    
  
UNION     ALL     SELECT     1954 , ' 0x0a5d0 ' , 42448     UNION     ALL     SELECT     1955 , ' 0x14573 ' , 83315    
  
UNION     ALL     SELECT     1956 , ' 0x052d0 ' , 21200     UNION     ALL     SELECT     1957 , ' 0x0a9a8 ' , 43432    
  
UNION     ALL     SELECT     1958 , ' 0x0e950 ' , 59728     UNION     ALL     SELECT     1959 , ' 0x06aa0 ' , 27296    
  
UNION     ALL     SELECT     1960 , ' 0x0aea6 ' , 44710     UNION     ALL     SELECT     1961 , ' 0x0ab50 ' , 43856    
  
UNION     ALL     SELECT     1962 , ' 0x04b60 ' , 19296     UNION     ALL     SELECT     1963 , ' 0x0aae4 ' , 43748    
  
UNION     ALL     SELECT     1964 , ' 0x0a570 ' , 42352     UNION     ALL     SELECT     1965 , ' 0x05260 ' , 21088    
  
UNION     ALL     SELECT     1966 , ' 0x0f263 ' , 62051     UNION     ALL     SELECT     1967 , ' 0x0d950 ' , 55632    
  
UNION     ALL     SELECT     1968 , ' 0x05b57 ' , 23383     UNION     ALL     SELECT     1969 , ' 0x056a0 ' , 22176    
  
UNION     ALL     SELECT     1970 , ' 0x096d0 ' , 38608     UNION     ALL     SELECT     1971 , ' 0x04dd5 ' , 19925    
  
UNION     ALL     SELECT     1972 , ' 0x04ad0 ' , 19152     UNION     ALL     SELECT     1973 , ' 0x0a4d0 ' , 42192    
  
UNION     ALL     SELECT     1974 , ' 0x0d4d4 ' , 54484     UNION     ALL     SELECT     1975 , ' 0x0d250 ' , 53840    
  
UNION     ALL     SELECT     1976 , ' 0x0d558 ' , 54616     UNION     ALL     SELECT     1977 , ' 0x0b540 ' , 46400    
  
UNION     ALL     SELECT     1978 , ' 0x0b5a0 ' , 46496     UNION     ALL     SELECT     1979 , ' 0x195a6 ' , 103846    
  
UNION     ALL     SELECT     1980 , ' 0x095b0 ' , 38320     UNION     ALL     SELECT     1981 , ' 0x049b0 ' , 18864    
  
UNION     ALL     SELECT     1982 , ' 0x0a974 ' , 43380     UNION     ALL     SELECT     1983 , ' 0x0a4b0 ' , 42160    
  
UNION     ALL     SELECT     1984 , ' 0x0b27a ' , 45690     UNION     ALL     SELECT     1985 , ' 0x06a50 ' , 27216    
  
UNION     ALL     SELECT     1986 , ' 0x06d40 ' , 27968     UNION     ALL     SELECT     1987 , ' 0x0af46 ' , 44870    
  
UNION     ALL     SELECT     1988 , ' 0x0ab60 ' , 43872     UNION     ALL     SELECT     1989 , ' 0x09570 ' , 38256    
  
UNION     ALL     SELECT     1990 , ' 0x04af5 ' , 19189     UNION     ALL     SELECT     1991 , ' 0x04970 ' , 18800    
  
UNION     ALL     SELECT     1992 , ' 0x064b0 ' , 25776     UNION     ALL     SELECT     1993 , ' 0x074a3 ' , 29859    
  
UNION     ALL     SELECT     1994 , ' 0x0ea50 ' , 59984     UNION     ALL     SELECT     1995 , ' 0x06b58 ' , 27480    
  
UNION     ALL     SELECT     1996 , ' 0x055c0 ' , 21952     UNION     ALL     SELECT     1997 , ' 0x0ab60 ' , 43872    
  
UNION     ALL     SELECT     1998 , ' 0x096d5 ' , 38613     UNION     ALL     SELECT     1999 , ' 0x092e0 ' , 37600    
  
UNION     ALL     SELECT     2000 , ' 0x0c960 ' , 51552     UNION     ALL     SELECT     2001 , ' 0x0d954 ' , 55636    
  
UNION     ALL     SELECT     2002 , ' 0x0d4a0 ' , 54432     UNION     ALL     SELECT     2003 , ' 0x0da50 ' , 55888    
  
UNION     ALL     SELECT     2004 , ' 0x07552 ' , 30034     UNION     ALL     SELECT     2005 , ' 0x056a0 ' , 22176    
  
UNION     ALL     SELECT     2006 , ' 0x0abb7 ' , 43959     UNION     ALL     SELECT     2007 , ' 0x025d0 ' , 9680    
  
UNION     ALL     SELECT     2008 , ' 0x092d0 ' , 37584     UNION     ALL     SELECT     2009 , ' 0x0cab5 ' , 51893    
  
UNION     ALL     SELECT     2010 , ' 0x0a950 ' , 43344     UNION     ALL     SELECT     2011 , ' 0x0b4a0 ' , 46240    
  
UNION     ALL     SELECT     2012 , ' 0x0baa4 ' , 47780     UNION     ALL     SELECT     2013 , ' 0x0ad50 ' , 44368    
  
UNION     ALL     SELECT     2014 , ' 0x055d9 ' , 21977     UNION     ALL     SELECT     2015 , ' 0x04ba0 ' , 19360    
  
UNION     ALL     SELECT     2016 , ' 0x0a5b0 ' , 42416     UNION     ALL     SELECT     2017 , ' 0x15176 ' , 86390    
  
UNION     ALL     SELECT     2018 , ' 0x052b0 ' , 21168     UNION     ALL     SELECT     2019 , ' 0x0a930 ' , 43312    
  
UNION     ALL     SELECT     2020 , ' 0x07954 ' , 31060     UNION     ALL     SELECT     2021 , ' 0x06aa0 ' , 27296    
  
UNION     ALL     SELECT     2022 , ' 0x0ad50 ' , 44368     UNION     ALL     SELECT     2023 , ' 0x05b52 ' , 23378    
  
UNION     ALL     SELECT     2024 , ' 0x04b60 ' , 19296     UNION     ALL     SELECT     2025 , ' 0x0a6e6 ' , 42726    
  
UNION     ALL     SELECT     2026 , ' 0x0a4e0 ' , 42208     UNION     ALL     SELECT     2027 , ' 0x0d260 ' , 53856    
  
UNION     ALL     SELECT     2028 , ' 0x0ea65 ' , 60005     UNION     ALL     SELECT     2029 , ' 0x0d530 ' , 54576    
  
UNION     ALL     SELECT     2030 , ' 0x05aa0 ' , 23200     UNION     ALL     SELECT     2031 , ' 0x076a3 ' , 30371    
  
UNION     ALL     SELECT     2032 , ' 0x096d0 ' , 38608     UNION     ALL     SELECT     2033 , ' 0x04bd7 ' , 19415    
  
UNION     ALL     SELECT     2034 , ' 0x04ad0 ' , 19152     UNION     ALL     SELECT     2035 , ' 0x0a4d0 ' , 42192    
  
UNION     ALL     SELECT     2036 , ' 0x1d0b6 ' , 118966     UNION     ALL     SELECT     2037 , ' 0x0d250 ' , 53840    
  
UNION     ALL     SELECT     2038 , ' 0x0d520 ' , 54560     UNION     ALL     SELECT     2039 , ' 0x0dd45 ' , 56645    
  
UNION     ALL     SELECT     2040 , ' 0x0b5a0 ' , 46496     UNION     ALL     SELECT     2041 , ' 0x056d0 ' , 22224    
  
UNION     ALL     SELECT     2042 , ' 0x055b2 ' , 21938     UNION     ALL     SELECT     2043 , ' 0x049b0 ' , 18864    
  
UNION     ALL     SELECT     2044 , ' 0x0a577 ' , 42359     UNION     ALL     SELECT     2045 , ' 0x0a4b0 ' , 42160    
  
UNION     ALL     SELECT     2046 , ' 0x0aa50 ' , 43600     UNION     ALL     SELECT     2047 , ' 0x1b255 ' , 111189    
  
UNION     ALL     SELECT     2048 , ' 0x06d20 ' , 27936     UNION     ALL     SELECT     2049 , ' 0x0ada0 ' , 44448  

SQL函数
--加此函数的目的是把数字换大写   
   CREATE     FUNCTION     [ dbo ] . [ f_num_str ]    ( @num     int )   
  
RETURNS     varchar ( 100 )   
  
AS    
  
BEGIN    
      
DECLARE     @n_str     VARCHAR ( 20 ), @re     VARCHAR ( 20 ), @i     int    
      
SELECT     @n_str = cast ( @num     as     varchar ), @i = 1 , @re = ''    
      
WHILE     @i <= len ( @n_str )   
      
BEGIN    
          
SET     @re = @re + SUBSTRING ( ' 零一二三四五六七八九 ' , CAST ( SUBSTRING ( @n_str , @i , 1 )    AS     int ) + 1 , 1 )   
          
SET     @i = @i + 1    
      
END    
      
RETURN     @re    
  
END    

   
存储过程
   CREATE     PROCEDURE    GetLunar_zhangzs   
  
@solarDay     DATETIME      
  
AS    
      
DECLARE     @solData     int            
      
DECLARE     @offset     int            
      
DECLARE     @iLunar     int            
      
DECLARE     @i     INT              
      
DECLARE     @j     INT              
      
DECLARE     @yDays     int            
      
DECLARE     @mDays     int            
      
DECLARE     @mLeap     int            
      
DECLARE     @mLeapNum     int            
      
DECLARE     @bLeap     smallint            
      
DECLARE     @temp     int            
      
DECLARE     @YEAR     INT              
      
DECLARE     @MONTH     INT            
      
DECLARE     @DAY     INT            
      
DECLARE     @OUTPUTDATE     varchar ( 10 )           
        
      
-- 保证传进来的日期是不带时间           
       SET     @solarDay = cast ( @solarDay     AS     char ( 10 ))           
      
SET     @offset = CAST ( @solarDay - ' 1900-01-30 '     AS     INT )       
        
      
-- 确定农历年开始           
       SET     @i = 1900            
      
-- SET   @offset=@solData           
       WHILE     @i < 2050     AND     @offset > 0            
      
BEGIN            
          
SET     @yDays = 348            
          
SET     @mLeapNum = 0            
          
SELECT     @iLunar = dataInt    FROM    SolarData    WHERE    yearId = @i            
          
          
-- 传回农历年的总天数           
           SET     @j = 32768            
          
WHILE     @j > 8            
          
BEGIN            
              
IF     @iLunar     &     @j     > 0            
                  
SET     @yDays = @yDays + 1            
              
SET     @j = @j / 2            
          
END            
            
          
-- 传回农历年闰哪个月   1-12   ,   没闰传回   0           
           SET     @mLeap     =     @iLunar     &     15            
    
          
-- 传回农历年闰月的天数   ,加在年的总天数上           
           IF     @mLeap     >     0            
          
BEGIN            
              
IF     @iLunar     &     65536     >     0            
                  
SET     @mLeapNum = 30            
              
ELSE              
                  
SET     @mLeapNum = 29            
                  
SET     @yDays = @yDays + @mLeapNum            
          
END            
          
SET     @offset = @offset - @yDays            
          
SET     @i = @i + 1            
      
END            
                
      
IF     @offset     <=     0            
      
BEGIN            
          
SET     @offset = @offset + @yDays            
          
SET     @i = @i - 1            
      
END            
    
      
-- 确定农历年结束               
       SET     @YEAR = @i            
        
      
-- 确定农历月开始           
       SET     @i     =     1            
      
SELECT     @iLunar = dataInt    FROM    SolarData    WHERE    yearId = @YEAR        
        
      
-- 判断那个月是润月           
       SET     @mLeap     =     @iLunar     &     15            
      
SET     @bLeap     =     0          
        
      
WHILE     @i     <     13     AND     @offset     >     0            
      
BEGIN            
          
-- 判断润月           
           SET     @mDays = 0            
          
IF    ( @mLeap     >     0     AND     @i     =    ( @mLeap + 1 )    AND     @bLeap = 0 )           
          
BEGIN -- 是润月           
               SET     @i = @i - 1            
              
SET     @bLeap = 1            
              
-- 传回农历年闰月的天数           
               IF     @iLunar     &     65536     >     0            
                  
SET     @mDays     =     30            
              
ELSE              
                  
SET     @mDays     =     29            
          
END            
          
ELSE            
          
-- 不是润月           
           BEGIN            
              
SET     @j = 1            
              
SET     @temp     =     65536              
              
WHILE     @j <= @i            
              
BEGIN            
                  
SET     @temp = @temp / 2            
                  
SET     @j = @j + 1            
              
END            
              
IF     @iLunar     &     @temp     >     0            
                  
SET     @mDays     =     30            
              
ELSE            
                  
SET     @mDays     =     29            
          
END                  
          
-- 解除闰月       
           IF     @bLeap = 1     AND     @i =    ( @mLeap + 1 )       
              
SET     @bLeap = 0        
              
SET     @offset = @offset - @mDays              
              
SET     @i = @i + 1            
      
END            
            
      
IF     @offset     <=     0            
      
BEGIN            
          
SET     @offset = @offset + @mDays            
          
SET     @i = @i - 1            
      
END            
        
      
-- 确定农历月结束               
       SET     @MONTH = @i        
            
      
-- 确定农历日结束               
       SET     @DAY = @offset            
            
    
SET     @OUTPUTDATE = convert ( varchar ( 10 ), CAST (( CAST ( @YEAR     AS     VARCHAR ( 4 )) + ' - ' + CAST ( @MONTH     AS     VARCHAR ( 2 )) + ' - ' + CAST ( @DAY     AS     VARCHAR ( 2 )))    AS     DATETIME )   , 120 )         
      
select       convert (    varchar ( 10 ), @solarDay    , 120 )    as    阳历   
      ,
cast (dbo.f_num_str( year ( @OUTPUTDATE ))    as     varchar ( 8 )) + ' 年| '     +      
            
case     when     datalength (dbo.f_num_str( month ( @OUTPUTDATE ))) = 4     then     case     when     left (dbo.f_num_str( month ( @OUTPUTDATE )), 1 ) <> ' '    
            
then     left ( month ( @OUTPUTDATE ), 1 )    else     ''     end     +     ' ' +     case     when     right (dbo.f_num_str( month ( @OUTPUTDATE )), 1 ) = ' '     then     ''     else     right (dbo.f_num_str( month ( @OUTPUTDATE )), 1 )    end       else    
            
cast (dbo.f_num_str( month ( @OUTPUTDATE ))    as     varchar ( 4 ))    end     + ' 月| '    
      
+     case     when     datalength (dbo.f_num_str( day ( @OUTPUTDATE ))) = 4     then       case     when     cast (dbo.f_num_str( day ( @OUTPUTDATE )   ) as     varchar ( 4 )) = ' 一零 ' then     ' '     else    ( case     when     left ( cast (dbo.f_num_str( day ( @OUTPUTDATE )   ) as     varchar ( 4 )), 1 ) <> ' '      
          
then     left ( cast (dbo.f_num_str( day ( @OUTPUTDATE )   ) as     varchar ( 4 )), 1 )    else     ''     end ) end     + ' ' +     case     when     right ( cast (dbo.f_num_str( day ( @OUTPUTDATE )   ) as     varchar ( 4 )), 1 ) = ' '     then     ''     else      
        
right ( cast (dbo.f_num_str( day ( @OUTPUTDATE )   ) as     varchar ( 4 )), 1 ) end     else     ' '     + cast (dbo.f_num_str( day ( @OUTPUTDATE )   ) as     varchar ( 4 ))    end     as      阴历   
  
GO   


2、页面级JS处理
要调用的JS,包括一个日期控件和农历类库 就此下载
页面级代码
function  setCNDate()
    
{
        
var lbnl=document.getElementById("lbNLBirthDay");
        
var hidnl=document.getElementById("hidNLBirthDay");
        
var span=document.getElementById('nl');
        lbnl.innerText
=span.innerText;
        hidnl.value
=span.innerText;
    }
< td  align ="right" >
                      生日:
</ td >
                  
< td  align ="left" >< input  name ="txtDate"  id ="txtDate"  runat ="server"   type ="text"  style ="border:1px solid #cccccc;"  value ="1900-1-1"  onfocus ="this.select()"   onclick ="reMethod=setCNDate;fPopCalendar(event,this,this);"  size ="12"   />
                      
&nbsp;&nbsp; < input  id ="ckbIsNL"  type ="checkbox"  runat ="server"  onclick ="javascript:IsUseNLBirthdat(this);"   /> 使用农历生日 &nbsp;&nbsp; < asp:Label
                          
ID ="lbNLBirthDay"  runat ="server"  Text ="Label" ></ asp:Label >
                      
< asp:HiddenField  ID ="hidNLBirthDay"  runat ="server"   />
                  
</ td >

转载于:https://www.cnblogs.com/7in10/archive/2007/12/05/983511.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值