在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美

當前位置:雨林木風下載站 > 技術開發教程 > 詳細頁面

公歷農歷相互轉換的算法及其VCL完成

公歷農歷相互轉換的算法及其VCL完成

更新時間:2022-05-16 文章作者:未知 信息來源:網絡 閱讀次數:

抱雪
你到過我的主頁嗎?在我的主頁上有這樣一個地方:
    你注意到了嗎,在顯示時間的地方除了顯示公歷之外,還顯示了農歷:農歷辛已(蛇)年二月廿三日未時,比一般的網站上只顯示公歷就酷多了(怎么像自吹自擂?別的網站千萬別去告我違反了廣告法)。這是怎么做的呢?其實很簡單,只要一個小小的PHP或者JavaScript程序就可以了。

       你不要著急地問我要PHP或JS的程序,最關鍵的是要了解算法,如果你明白了轉換的道理,就可以達到圣人所說的:舉一而三反焉,到時不管是用PHP、DELPHI、JS還是JSP、VB,你都可以很快地寫公歷農歷相互轉換的程序來出來。我記得有高人曾經說過,編程語言只是工具,數據結構才是最重要的,此言誠不虛也。

       閑話少說,下面我就來介紹一下具體的算法。

首先是要保存公農歷之間的轉換信息:以任意一年作為起點,把從這一年起若干年(若干是多少?就看你的需要了)的農歷信息保存起來(在我的VCL中,是以1921年作為起點)。回想一下,我們平常是怎樣來轉換公歷農歷的呢?是查萬年歷,萬年歷有每一天的公歷農歷,直接一查就可以了。那么我們可不可以也這樣做呢?當然可以,但是,這樣做就要收錄每一天的信息,工作量就會很大,所以我們要簡化這些信息。怎么簡化呢?要保存一年的信息其實只要兩個信息就可以了:1、農歷每個月的大小;2、今年是否有閏月,閏幾月以及閏月的大小。用一個整數來保存這些信息就足夠了。具體的方法是:用一位來表示一個月的大小,大月記為1,小月記為0,這樣就用掉12位(無閏月)或13位(有閏月),再用高4位來表示閏月的月份,沒有閏月記為0。比如說,2000年的信息數據是是0xC96,化成二進制就是110010010110B,表示的含義是指1、2、5、8、10、11月大,其余月小;2001年的農歷信息數據是0x41A95,其中4表示今年閏四月,月份大小信息就是0x1A95(因為閏月,所以有13位),具體的就是1、2、4、5、8、10、12月大,其余月份小(0x1A95=1101010010101B),要注意在四月的后面那一個0表示的是閏四月小,接著的那個1表示5月大。這樣就可以用一個數組來保存這些信息。在我的VCL程序中是用ChineseCalendarData[]這個數組來保存這些信息。

為了方便對算法的理解,首先來看看我的VCL組件hsDivineCalendar的頭文件

//---------------------------------------------------------------------------

  

#ifndef hsDivineCalendarH

#define hsDivineCalendarH

#define ALLYEARS 100        //定義轉換的年數:100年

//---------------------------------------------------------------------------

#include <SysUtils.hpp>

#include <Controls.hpp>

#include <Classes.hpp>

#include <Forms.hpp>

//---------------------------------------------------------------------------

class PACKAGE ThsDivineCalendar : public TComponent

{

private:

   int ChineseCalendarData[ALLYEARS];       //農歷數據

   AnsiString str2,num;         //要用的字符串

   void __fastcall c2e();              //農歷到公歷

   void __fastcall e2c();              //公歷到農歷

   TDateTime TheDate;                  //日期

   int FYear,FMonth,FDay,FTime;          //公歷年月日時

   int FcYear,FcMonth,FcDay,FcTime;      //農歷年月日時

   AnsiString __fastcall GetDateString();     //獲取日期字符串

   AnsiString __fastcall GetcDateString();    //獲取農歷日期字符串

   int __fastcall GetBit(int m,int n);    //獲取1bit

   void __fastcall GetYMD();              //獲取年月日

   void __fastcall SetDate(TDateTime);             //用一個TDateTime類型的變量轉換

   //-----------分別修改公歷的年月日時-------------------------------------

   void __fastcall SetYear(int AYear){SetBy(AYear,FMonth,FDay,FTime);};

   void __fastcall SetMonth(int AMonth){SetBy(FYear,AMonth,FDay,FTime);};

   void __fastcall SetDay(int ADay){SetBy(FYear,FMonth,ADay,FTime);};  

   void __fastcall SetTime(int ATime){SetBy(FYear,FMonth,FDay,ATime);};

   //-----------分別修改農歷的年月日時---------------------------------------

   void __fastcall SetcYear(int AcYear){SetByc(AcYear,FcMonth,FcDay,FcTime);};

   void __fastcall SetcMonth(int AcMonth){SetByc(FcYear,AcMonth,FcDay,FcTime);};

   void __fastcall SetcDay(int AcDay){SetByc(FcYear,FcMonth,AcDay,FcTime);};

   void __fastcall SetcTime(int AcTime){SetByc(FcYear,FcMonth,FcDay,AcTime);};

   TDateTime __fastcall GetLastJie(); //取得上一個節

   TDateTime __fastcall GetNextJie();       //取得下一個節

   TDateTime __fastcall GetLastQi();  //取得上一個中氣

   TDateTime __fastcall GetNextQi(); //取得下一個中氣

   int __fastcall GetDayOfWeek();      //取得一周的第幾天

   AnsiString __fastcall GetWeekString();   //返回星期幾的字符串

protected:

public:

   void __fastcall SetBy(int,int,int,int);    //用公歷設置

   void __fastcall SetByc(int,int,int,int);   //用農歷設置

   __fastcall ThsDivineCalendar(TComponent* Owner);

   //屬性:年月日時

   __property int Year={read=FYear,write=SetYear};

   __property int Month={read=FMonth,write=SetMonth};

   __property int Day={read=FDay,write=SetDay};

   __property int Time={read=FTime,write=SetTime};

   //屬性:農歷年月日時

   __property int cYear={read=FcYear,write=SetcYear};

   __property int cMonth={read=FcMonth,write=SetcMonth};

   __property int cDay={read=FcDay,write=SetcDay};

   __property int cTime={read=FcTime,write=SetcTime};

   //公歷農歷日期字符串

   __property AnsiString DateString={read=GetDateString};

   __property AnsiString cDateString={read=GetcDateString};

   //其他屬性

   __property TDateTime DateTime={read=TheDate,write=SetDate};

   __property TDateTime LastJie  = { read=GetLastJie };

   __property TDateTime NextJie  = { read=GetNextJie };

   __property TDateTime LastQi  = { read=GetLastQi };

   __property TDateTime NextQi  = { read=GetNextQi };

   __property int DayOfWeek  = { read=GetDayOfWeek };

   __property AnsiString WeekString  = { read=GetWeekString };

__published:

};

//---------------------------------------------------------------------------

#endif

下面介紹轉換的具體算法。

一、公歷轉換成農歷

1、計算出所求時間到起始年正月初一的天數。

2、從起始年份開始,減去每一月的天數,一直到剩余天數沒有下一個月多為止

此時,ChineseCalendarData[]的下標到了多少,就是減去了多少年,用起始年份加上這個下標就可以得到農歷年份;然后看減去了幾個月,如果本年不閏月或者閏月還在后面,就可以直接得到農歷月份,如果在閏月月份數后面一個月,則這個月就是閏月,如果在閏月的后面,則要減去1才能得到月份數;剩余的天數就是農歷日;農歷時用(公歷時+1)/2就可以簡單地得到了。具體的代碼如下:

//---------------------------------------------------------------------------

void __fastcall ThsDivineCalendar::e2c()

{

        int total,m,n,k;

        bool isEnd=false;    //用以判斷是否不夠減了

        total=(int)TheDate-7709;     //到1921-2-8(正月初一)的天數

        for(m=0;;m++)

        {

/*判斷本年是否閏月,用以確定月份信息的起點

  有閏月有13位(0~12),無12位(0~11)*/

k=(ChineseCalendarData[m]<0xfff)?11:12; for(n=k;n>=0;n--)

                {

                                          //如果不夠減

                        if(total<=29+GetBit(ChineseCalendarData[m],n))

{

isEnd=true; //設置標志

break; //退出內層循環

}

/*夠減,減去一個月的天數

先減去29天如果月大,則對應的信息位為1,

又減去一天*/

total=total-29-GetBit(ChineseCalendarData[m],n);

}

if(isEnd)break; //如果不夠減,退出外層循環

}

FcYear=1921 + m; //農歷年=起始年份+下標

FcMonth=k-n+1; //農歷月=本年的月份數(k+1)減去已經減去的月份數(n)

FcDay=total; //農歷日=剩余天數

unsigned short int t1,t2,t3,t4;

TheDate.DecodeTime(&t1,&t2,&t3,&t4);

FcTime=(t1+1)>>1;             //農歷時

        if(k==12)              //如果本年有閏月

        {

                if(FcMonth==ChineseCalendarData[m]/0x10000+1)//就是閏月

                        FcMonth=1-FcMonth;

                if(FcMonth>ChineseCalendarData[m]/0x10000+1)//閏月后面

                        FcMonth--;

        }

}

//----------------------------------------------------------------------------

二、農歷到公歷的轉換

這個算法比較簡單,只要計算所求時候到起始年正月初一的總天數就可以了,要計算總天數,只要統計出本月以前的大月小月書就可以了,然后把這個值賦予TdateTime類型的TheDate就可以用TdateTime的成員函數DecodeDate得到公歷的年月日了。具體代碼如下:

//----------------------------------------------------------------------------

void __fastcall ThsDivineCalendar::c2e()

{

    int i,k,m,p,y[]={0,0};

       //y[0]:小月、y[1]:大月

    //本年以前的大月小月數

    for(i=0;i<FcYear-1921;i++)

{

k=(ChineseCalendarData[i]<0xfff)?11:12;

for(m=0;m<=k;m++)

y[GetBit(ChineseCalendarData[i],m)]++;

}

//統計本年本月以前的大月小月數

//本年不是閏年

if(ChineseCalendarData[i]<0xfff)

for(m=13-FcMonth;m<=11;m++)

y[GetBit(ChineseCalendarData[i],m)]++;

else // 是閏年

{

k=ChineseCalendarData[i]/0x10000;

//根據在閏月前后決定統計的起始位置

p=(FcMonth>k)?13-FcMonth:14-FcMonth;

        if(k+FcMonth==0)p=13+FcMonth;     //本月就是閏月

        for(m=p;m<=12;m++)

y[GetBit(ChineseCalendarData[i],m)]++;

}

//7709就是1920年臘月三十

TheDate=7709+y[0]*29+y[1]*30+FcDay+FcTime*2.0/24;

}

//----------------------------------------------------------------------------

void __fastcall ThsDivineCalendar::GetYMD()

{

unsigned short y,m,d,t;

TheDate.DecodeDate(&y,&m,&d);

FYear=y;

FMonth=m;

FDay=d;

TheDate.DecodeTime(&t,&y,&m,&d);

FTime=t;

}

//----------------------------------------------------------------------------

以上就是公歷農歷相互轉換的算法和VCL代碼,只要理解了這些算法,你就不難寫出其他的程序,我就寫了JavaScript和PHP的代碼,其實PHP、JS的代碼簡單得多,只需要有公歷到農歷的轉換就可以了。如果你想要這些代碼和完整的VCL源代碼,你就說嘛,你不說我怎么知道你想要呢?雖然你很有誠意地看著我……,哈哈,我又中《大話西游》的毒了:=)。其實,這些代碼你可以在《電腦愛好者》網站或者我的主頁(http://bcbtop.126.com)的主頁下載。
http://hugsnow.myetang.com/source/hugsnow1.zip

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美
  • <li id="86scu"><menu id="86scu"></menu></li>
    <li id="86scu"></li>
    <button id="86scu"></button>
  • <s id="86scu"></s><button id="86scu"><menu id="86scu"></menu></button>
  • www.中文字幕在线| 毛片毛片毛片毛| 狠狠爱免费视频| 无码人妻精品一区二区三区66| 最新免费av网址| 色婷婷综合久久久久中文字幕 | 日本日本19xxxⅹhd乱影响| 欧美三级在线观看视频| 91亚洲精品久久久蜜桃借种| 中文字幕第一页亚洲| 91欧美视频在线| 国产自产在线视频| av免费中文字幕| 国产精品波多野结衣| 美女福利视频在线| 久久久久久久久影视| 黄色aaa级片| 欧美精品久久久久久久免费| 成人性做爰aaa片免费看不忠| 日本三级中文字幕在线观看| 国产一二三区av| 亚洲人成色77777| 激情五月婷婷基地| 日本在线视频www| 久久久久久久9| 色撸撸在线观看| 色播五月综合网| 五月天亚洲视频| 亚洲免费一级视频| 毛片毛片毛片毛片毛片毛片毛片毛片毛片 | 777一区二区| 欧美性大战久久久久xxx | 最新视频 - x88av| 91 视频免费观看| 欧美性受黑人性爽| 国精产品一区一区三区视频| 免费在线精品视频| 男生操女生视频在线观看 | 免费在线看黄色片| 怡红院av亚洲一区二区三区h| 久久艹国产精品| 久久av综合网| 国产精品97在线| 影音先锋成人资源网站| aa免费在线观看| 美女av免费在线观看| 黄色三级视频在线| 一级黄色在线播放| 中文字幕第一页在线视频| 男人添女荫道口喷水视频| 好吊色这里只有精品| 日韩欧美一区二| 女人和拘做爰正片视频| 又粗又黑又大的吊av| 久久无码高潮喷水| 日韩精品xxxx| 天天干天天操天天做| 国产奶头好大揉着好爽视频| 99亚洲国产精品| 国产又黄又大又粗视频| 中文av一区二区三区| 路边理发店露脸熟妇泻火| 免费av观看网址| 黄色a级片免费| 丁香婷婷综合激情| wwww.国产| 17c丨国产丨精品视频| 亚州精品一二三区| 国产专区在线视频| xxx国产在线观看| 美女扒开大腿让男人桶| 欧美大片久久久| 国产午夜大地久久| 午夜剧场高清版免费观看 | 欧洲美女和动交zoz0z| 欧美亚洲另类色图| 黄色网址在线免费看| 欧美精品无码一区二区三区| 亚洲天堂网2018| 男人透女人免费视频| 久久久久久综合网| 四季av一区二区| 青青草视频在线免费播放| 久久av秘一区二区三区| 欧洲熟妇精品视频| 怡红院av亚洲一区二区三区h| 国产又爽又黄ai换脸| 黄色一级片在线看| 欧美一级特黄aaaaaa在线看片| 日韩国产欧美亚洲| 中文字幕av导航| 国产a级一级片| 日韩a∨精品日韩在线观看| 欧美中文字幕在线观看视频 | 午夜不卡福利视频| 午夜视频在线瓜伦| 草草久久久无码国产专区| 亚洲 欧美 综合 另类 中字| 日韩成人av免费| 肉色超薄丝袜脚交| 污视频在线观看免费网站| av在线免费看片| 久久黄色免费看| 久久精品亚洲天堂| 国内精品国产三级国产aⅴ久| 一区二区免费av| 欧美日韩精品区别| 黄黄视频在线观看| 日本一道在线观看| 国产黄色激情视频| 成人午夜免费在线| 青青视频在线播放| 日本wwwcom| 久久久一二三四| 日本美女高潮视频| 欧洲美女亚洲激情| 国产免费一区二区三区四在线播放 | 99热成人精品热久久66| 中文久久久久久| 777久久久精品一区二区三区| 黄色一级二级三级| 熟妇人妻无乱码中文字幕真矢织江| 在线免费观看av的网站| 懂色av粉嫩av蜜臀av| 国产淫片免费看| 色播五月综合网| 99热这里只有精品免费| 久草在在线视频| 粉嫩虎白女毛片人体| 911福利视频| 亚洲最大综合网| 欧妇女乱妇女乱视频| 久久久一二三四| 日韩欧美一区二| 五月天婷婷亚洲| 成年人午夜免费视频| 三年中文在线观看免费大全中国| 第九区2中文字幕| 中文字幕在线导航| 欧美一级中文字幕| 少妇人妻无码专区视频| 日本一区午夜艳熟免费| 亚洲久久中文字幕| 欧美三级一级片| 九一免费在线观看| 91 在线视频观看| 日韩欧美在线播放视频| 亚洲第一精品区| 日本在线一二三区| 看看黄色一级片| 无码人妻精品一区二区三区66| 在线免费黄色小视频| 国产高清av在线播放| 国产91在线免费| 成人国产在线看| 九九热精品国产| 五月婷婷之综合激情| 亚洲欧洲日产国码无码久久99| 91制片厂毛片| 国产97色在线 | 日韩| 亚洲熟妇av日韩熟妇在线| 黄色a级片免费看| av中文字幕av| 中文字幕永久有效| 欧美精品卡一卡二| 国产成人永久免费视频| 999一区二区三区| 2022中文字幕| 在线观看免费污视频| 天堂社区在线视频| av在线播放亚洲| 国产在线观看福利| 国产又粗又猛又爽又黄的网站 | 黄色一级在线视频| 国产免费黄视频| 丰满爆乳一区二区三区| 国产h视频在线播放| 久久久久国产精品熟女影院| 欧美色图色综合| 少妇黄色一级片| 中国丰满人妻videoshd | 免费观看国产视频在线| 黄网站色视频免费观看| 黑鬼大战白妞高潮喷白浆| 久久婷婷中文字幕| 男人午夜视频在线观看| 国产av熟女一区二区三区| 免费日韩视频在线观看| 天天干天天操天天做| 欧美 国产 精品| 免费看又黄又无码的网站| 亚洲无吗一区二区三区| 先锋影音男人资源| 妞干网在线视频观看| 国产精品拍拍拍| 日韩视频 中文字幕| 男人舔女人下面高潮视频| 中文字幕55页| 国产精品秘入口18禁麻豆免会员| 成人午夜激情av|