http://expert.csdn.net/Expert/topic/1182/1182068.xml?temp=.5255854
可以参考一下

解决方案 »

  1.   

    偶一本书上有basic的程序。不过实在懒得给你打字了。
      

  2.   

    可以去 www.easthot.net 发个帖子问巴顿他以前写过这个控件,在这里发表过的
      

  3.   

    [名称]           农历的算法[语言种类]       Visual Basic[类别一]         算法[类别二]         空[类别三]         空[数据来源]       未知[保存时间]       2002-01-10[关键字一]       农历[关键字二]       阴阳历[关键字三]       算法[内容简介]       空[源代码内容]Dim WeekName(7), MonthAdd(11), NongliData(99), TianGan(9), DiZhi(11), ShuXiang(11), DayName(30), MonName(12)
    Dim curTime, curYear, curMonth, curDay, curWeekday
    Dim GongliStr, WeekdayStr, NongliStr, NongliDayStr
    Dim i, m, n, k, isEnd, bit, TheDate
    Private Sub Form_Load()
    '获取当前系统时间
    curTime = Now()'星期名
    WeekName(0) = " * "
    WeekName(1) = "星期日"
    WeekName(2) = "星期一"
    WeekName(3) = "星期二"
    WeekName(4) = "星期三"
    WeekName(5) = "星期四"
    WeekName(6) = "星期五"
    WeekName(7) = "星期六"'天干名称
    TianGan(0) = "甲"
    TianGan(1) = "乙"
    TianGan(2) = "丙"
    TianGan(3) = "丁"
    TianGan(4) = "戊"
    TianGan(5) = "己"
    TianGan(6) = "庚"
    TianGan(7) = "辛"
    TianGan(8) = "壬"
    TianGan(9) = "癸"'地支名称
    DiZhi(0) = "子"
    DiZhi(1) = "丑"
    DiZhi(2) = "寅"
    DiZhi(3) = "卯"
    DiZhi(4) = "辰"
    DiZhi(5) = "巳"
    DiZhi(6) = "午"
    DiZhi(7) = "未"
    DiZhi(8) = "申"
    DiZhi(9) = "酉"
    DiZhi(10) = "戌"
    DiZhi(11) = "亥"'属相名称
    ShuXiang(0) = "鼠"
    ShuXiang(1) = "牛"
    ShuXiang(2) = "虎"
    ShuXiang(3) = "兔"
    ShuXiang(4) = "龙"
    ShuXiang(5) = "蛇"
    ShuXiang(6) = "马"
    ShuXiang(7) = "羊"
    ShuXiang(8) = "猴"
    ShuXiang(9) = "鸡"
    ShuXiang(10) = "狗"
    ShuXiang(11) = "猪"'农历日期名
    DayName(0) = "*"
    DayName(1) = "初一"
    DayName(2) = "初二"
    DayName(3) = "初三"
    DayName(4) = "初四"
    DayName(5) = "初五"
    DayName(6) = "初六"
    DayName(7) = "初七"
    DayName(8) = "初八"
    DayName(9) = "初九"
    DayName(10) = "初十"
    DayName(11) = "十?quot;"
    DayName(12) = "十二"
    DayName(13) = "十三"
    DayName(14) = "十四"
    DayName(15) = "十五"
    DayName(16) = "十六"
    DayName(17) = "十七"
    DayName(18) = "十八"
    DayName(19) = "十九"
    DayName(20) = "二十"
    DayName(21) = "廿一"
    DayName(22) = "廿二"
    DayName(23) = "廿三"
    DayName(24) = "廿四"
    DayName(25) = "廿五"
    DayName(26) = "廿六"
    DayName(27) = "廿七"
    DayName(28) = "廿八"
    DayName(29) = "廿九"
    DayName(30) = "三十"'农历月份名
    MonName(0) = "*"
    MonName(1) = "正"
    MonName(2) = "二"
    MonName(3) = "三"
    MonName(4) = "四"
    MonName(5) = "五"
    MonName(6) = "六"
    MonName(7) = "七"
    MonName(8) = "八"
    MonName(9) = "九"
    MonName(10) = "十"
    MonName(11) = "十一"
    MonName(12) = "腊"'公历每月前面的天数
    MonthAdd(0) = 0
    MonthAdd(1) = 31
    MonthAdd(2) = 59
    MonthAdd(3) = 90
    MonthAdd(4) = 120
    MonthAdd(5) = 151
    MonthAdd(6) = 181
    MonthAdd(7) = 212
    MonthAdd(8) = 243
    MonthAdd(9) = 273
    MonthAdd(10) = 304
    MonthAdd(11) = 334'农历数据
    NongliData(0) = 2635
    NongliData(1) = 333387
    NongliData(2) = 1701
    NongliData(3) = 1748
    NongliData(4) = 267701
    NongliData(5) = 694
    NongliData(6) = 2391
    NongliData(7) = 133423
    NongliData(8) = 1175
    NongliData(9) = 396438
    NongliData(10) = 3402
    NongliData(11) = 3749
    NongliData(12) = 331177
    NongliData(13) = 1453
    NongliData(14) = 694
    NongliData(15) = 201326
    NongliData(16) = 2350
    NongliData(17) = 465197
    NongliData(18) = 3221
    NongliData(19) = 3402
    NongliData(20) = 400202
    NongliData(21) = 2901
    NongliData(22) = 1386
    NongliData(23) = 267611
    NongliData(24) = 605
    NongliData(25) = 2349
    NongliData(26) = 137515
    NongliData(27) = 2709
    NongliData(28) = 464533
    NongliData(29) = 1738
    NongliData(30) = 2901
    NongliData(31) = 330421
    NongliData(32) = 1242
    NongliData(33) = 2651
    NongliData(34) = 199255
    NongliData(35) = 1323
    NongliData(36) = 529706
    NongliData(37) = 3733
    NongliData(38) = 1706
    NongliData(39) = 398762
    NongliData(40) = 2741
    NongliData(41) = 1206
    NongliData(42) = 267438
    NongliData(43) = 2647
    NongliData(44) = 1318
    NongliData(45) = 204070
    NongliData(46) = 3477
    NongliData(47) = 461653
    NongliData(48) = 1386
    NongliData(49) = 2413
    NongliData(50) = 330077
    NongliData(51) = 1197
    NongliData(52) = 2637
    NongliData(53) = 268877
    NongliData(54) = 3365
    NongliData(55) = 531109
    NongliData(56) = 2900
    NongliData(57) = 2922
    NongliData(58) = 398042
    NongliData(59) = 2395
    NongliData(60) = 1179
    NongliData(61) = 267415
    NongliData(62) = 2635
    NongliData(63) = 661067
    NongliData(64) = 1701
    NongliData(65) = 1748
    NongliData(66) = 398772
    NongliData(67) = 2742
    NongliData(68) = 2391
    NongliData(69) = 330031
    NongliData(70) = 1175
    NongliData(71) = 1611
    NongliData(72) = 200010
    NongliData(73) = 3749
    NongliData(74) = 527717
    NongliData(75) = 1452
    NongliData(76) = 2742
    NongliData(77) = 332397
    NongliData(78) = 2350
    NongliData(79) = 3222
    NongliData(80) = 268949
    NongliData(81) = 3402
    NongliData(82) = 3493
    NongliData(83) = 133973
    NongliData(84) = 1386
    NongliData(85) = 464219
    NongliData(86) = 605
    NongliData(87) = 2349
    NongliData(88) = 334123
    NongliData(89) = 2709
    NongliData(90) = 2890
    NongliData(91) = 267946
    NongliData(92) = 2773
    NongliData(93) = 592565
    NongliData(94) = 1210
    NongliData(95) = 2651
    NongliData(96) = 395863
    NongliData(97) = 1323
    NongliData(98) = 2707
    NongliData(99) = 265877
     '生成当前公历年、月、日 ==> GongliStr
    curYear = Year(curTime)
    curMonth = Month(curTime)
    curDay = Day(curTime)GongliStr = curYear & "年"
    If (curMonth < 10) Then
        GongliStr = GongliStr & "0" & curMonth & "月"
    Else
        GongliStr = GongliStr & curMonth & "月"
    End If
    If (curDay < 10) Then
        GongliStr = GongliStr & "0" & curDay & "日"
    Else
        GongliStr = GongliStr & curDay & "日"
    End If'生成当前公历星期 ==> WeekdayStr
    curWeekday = Weekday(curTime)
    WeekdayStr = WeekName(curWeekday)'计算到初始时间1921年2月8日的天数:1921-2-8(正月初一)
    TheDate = (curYear - 1921) * 365 + Int((curYear - 1921) / 4) + curDay + MonthAdd(curMonth - 1) - 38
    If ((curYear Mod 4) = 0 And curMonth > 2) Then
        TheDate = TheDate + 1
    End If'计算农历天干、地支、月、日
    isEnd = 0
    m = 0Do
        If (NongliData(m) < 4095) Then
            k = 11
        Else
            k = 12
        End If    n = k
        Do
            If (n < 0) Then
                Exit Do
            End If    '获取NongliData(m)的第n个二进制位的值
        bit = NongliData(m)
        For i = 1 To n Step 1
            bit = Int(bit / 2)
        Next
        bit = bit Mod 2    If (TheDate <= 29 + bit) Then
            isEnd = 1
            Exit Do
        End If    TheDate = TheDate - 29 - bit    n = n - 1
      Loop  If (isEnd = 1) Then
          Exit Do
      End If  m = m + 1
    LoopcurYear = 1921 + m
    curMonth = k - n + 1
    curDay = TheDateIf (k = 12) Then
        If (curMonth = (Int(NongliData(m) / 65536) + 1)) Then
            curMonth = 1 - curMonth
        ElseIf (curMonth > (Int(NongliData(m) / 65536) + 1)) Then
            curMonth = curMonth - 1
        End IfEnd If'生成农历天干、地支、属相 ==> NongliStr
    NongliStr = "农历" & TianGan(((curYear - 4) Mod 60) Mod 10) & DiZhi(((curYear - 4) Mod 60) Mod 12) & "年"
    NongliStr = NongliStr & "(" & ShuXiang(((curYear - 4) Mod 60) Mod 12) & ")"'生成农历月、日 ==> NongliDayStr
    If (curMonth < 1) Then
        NongliDayStr = "闰" & MonName(-1 * curMonth)
    Else
        NongliDayStr = MonName(curMonth)
    End If
    NongliDayStr = NongliDayStr & "月"NongliDayStr = NongliDayStr & DayName(curDay)MsgBox NongliStr & NongliDayStrEnd Sub
         以上代码保存于: SourceCode Explorer(源代码数据库)
               复制时间: 2002-12-15 1:33:57
               软件版本: 1.0.793
               软件作者: Shawls
               个人主页: Http://Shawls.Yeah.Net
                 E-Mail: [email protected]
                     QQ: 9181729
      

  4.   

    [名称]           农历算法(C++)[语言种类]       C/C++[类别一]         算法[类别二]         空[类别三]         空[数据来源]       未知[保存时间]       2002-11-29[关键字一]       农历[关键字二]       C++[关键字三]       空[内容简介]       空[源代码内容]/***************************************************************************
       致看到这些源代码的兄弟:
           你好!
           这本来是我为一个商业PDA产品开发的日历程序,最近移植于PC机上, 所以算法
       和数据部分是用纯C++写的,不涉及MFC,所有的代码都是以短节省存储空间为主要目
       的.
       很高兴你对这些代码有兴趣,你可以随意复制和使用些代码,唯一有一点小小的
       愿望:在你使用和复制给别人时,别忘注明这些代码作者:-)。程序代码也就罢了,后
       面的数据可是我辛辛苦苦从万年历上找出来输进去的。
       如果你有什么好的意见不妨Mail给我。       [email protected]
       或
       [email protected]
                                                                     2000年3月
    ****************************************************************************/
    #if !defined(AFX_CALENDAR1_H__FD9A6DAF_8C3C_493C_AAD4_612134D8F6D4__INCLUDED_)
    #define AFX_CALENDAR1_H__FD9A6DAF_8C3C_493C_AAD4_612134D8F6D4__INCLUDED_#if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
    // Calendar1.h : header file
    /////////////////////////////////////////////////////////////////////////////
    // CCalendar window
    extern const WORD START_YEAR;
    extern const WORD END_YEAR;//define user message select changed
    #define UM_SELCHANGE  (WM_USER+101)class CCalendar : public CWnd
    {
    private:
      WORD    m_iYear, m_iMonth, m_iDay;
      CBitmap m_oBitMapList[42];
      CMenu   m_oPopMenu;
      CRect   m_sSelRect;public:
      COLORREF m_dwBackColor,  m_dwForeColor;
      COLORREF m_dwSelColor,   m_dwSelForeColor;
      COLORREF m_dwTitleBkColor, m_dwTitleColor;public:
      CCalendar(WORD iYear, WORD iMonth, WORD iDay);
      CCalendar();
      virtual BOOL Create(RECT &rect, CWnd * pParentWnd, UINT nID);public:
      WORD GetYear(){return m_iYear;}
      WORD GetMonth(){return m_iMonth;}
      WORD GetDay(){return m_iDay;}
      void GetDate(WORD &iYear, WORD &iMonth, WORD &iDay);
      BOOL SetDate(WORD iYear, WORD iMonth, WORD iDay);protected:
      CButton m_obutToday;
      //{{AFX_MSG(CCalendar)
      afx_msg void OnPaint();
      afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
      afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);
      //}}AFX_MSG
      afx_msg void OnTitleBkColor();
      afx_msg void OnTitleColor();
      afx_msg void OnSelColor();
      afx_msg void OnForeColor();
      DECLARE_MESSAGE_MAP()
    public:
      //判断iYear是不是闰年
        static BOOL IsLeapYear(WORD iYear)
      {return !(iYear%4)&&(iYear%100) || !(iYear%400);}  //计算iYear,iMonth,iDay对应是星期几 1年1月1日 --- 65535年12月31日
      static WORD WeekDay(WORD iYear, WORD iMonth, WORD iDay);  //返回iYear年iMonth月的天数 1年1月 --- 65535年12月
      static WORD MonthDays(WORD iYear, WORD iMonth);  //返回阴历iLunarYer年阴历iLunarMonth月的天数,如果iLunarMonth为闰月,
      //高字为第二个iLunarMonth月的天数,否则高字为0 
      // 1901年1月---2050年12月
      static LONG LunarMonthDays(WORD iLunarYear, WORD iLunarMonth);  //返回阴历iLunarYear年的总天数
      // 1901年1月---2050年12月
      static WORD LunarYearDays(WORD iLunarYear);  //返回阴历iLunarYear年的闰月月份,如没有返回0
      // 1901年1月---2050年12月
      static WORD GetLeapMonth(WORD iLunarYear);  //把iYear年格式化成天干记年法表示的字符串
      static void FormatLunarYear(WORD  iYear, char *pBuffer);  //把iMonth格式化成中文字符串
      static void FormatMonth(WORD iMonth, char *pBuffer, BOOL bLunar = TRUE);    //把iDay格式化成中文字符串
      static void FormatLunarDay(WORD  iDay, char *pBuffer);  //计算公历两个日期间相差的天数  1年1月1日 --- 65535年12月31日
      static LONG CalcDateDiff(WORD iEndYear, WORD iEndMonth, WORD iEndDay,
                             WORD iStartYear = START_YEAR, 
                   WORD iStartMonth =1, WORD iStartDay =1);  //计算公历iYear年iMonth月iDay日对应的阴历日期,返回对应的阴历节气 0-24
      //1901年1月1日---2050年12月31日
      static WORD GetLunarDate(WORD iYear, WORD iMonth, WORD iDay,
                             WORD &iLunarYear, WORD &iLunarMonth, WORD &iLunarDay);public:
      virtual ~CCalendar();private:
      void   l_InitData();  //计算从1901年1月1日过iSpanDays天后的阴历日期
      static BYTE   l_CalcLunarDate(WORD &iYear, WORD &iMonth,WORD &iDay, LONG iSpanDays);
        //计算公历iYear年iMonth月iDay日对应的节气 0-24,0表不是节气
      static WORD   l_GetLunarHolDay(WORD iYear, WORD iMonth, WORD iDay);  WORD l_CalcSelectDay(POINT * pt);
      void l_PaintTitle(CPaintDC &dc);
      void l_PaintDate(CPaintDC &dc);
      inline void l_PaintOneDay(CPaintDC &dc, CDC &imgdc, WORD &iDay, 
                                WORD &iLunarYear,
                                WORD &iLunarMonth, WORD &iLuanrDay, 
                    LONG startx, LONG starty, BYTE bSecondLeapMonth);
    };///////////////////////////////////////////////////////////////////////////////{{AFX_INSERT_LOCATION}}
    // Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif // !defined(AFX_CALENDAR1_H__FD9A6DAF_8C3C_493C_AAD4_612134D8F6D4__INCLUDED_)     以上代码保存于: SourceCode Explorer(源代码数据库)
               复制时间: 2002-12-15 1:34:38
               软件版本: 1.0.793
               软件作者: Shawls
               个人主页: Http://Shawls.Yeah.Net
                 E-Mail: [email protected]
                     QQ: 9181729`----=====---
    奔跑的思考者
    ----=====---
      

  5.   

    和楼主一样
    我也正想找这种算法
    但是我看了好多的算法都只是对N年之内有效
    找真真正正的万“年历”中……强烈的GZ