[Delphi]將農曆轉換爲公曆的算法

這兩個過程是在應用單元中的,必須包含一個先成的單元calfunc.unit ,該單元的功能是將公曆轉農曆的.代碼太多貼不出來.

先說下這個算法的大概思路:

單元calfunc.unit中有個函數CnMonthStr,CnDayStr,CnDateOfDateStr都是對應的公曆轉農曆的.利用公共單元可以從公曆獲得農曆.然後將當前輸入的農曆帶入NDateToGDate函數中,作爲公曆求農曆,一直將農曆網後加一天,直到獲得的農曆和輸入的公曆的農曆相同爲止.這句話比較難懂,暫時不用去想是怎麼回事,弄個圖抽象出來會比較好懂點:

 

INPUT:我們輸入的農曆

CNINP:根據輸入的農曆(作爲公曆)獲得的農曆

VDATE:我們目標要獲得的公曆

CDATE:目標公曆對應的農曆這個值和INPUT一開始是相等的(爲什麼?因爲我強制讓他的初值相等)

----------------------------------------INPUT--------------------------------------

CNINP------------------------------------------------------------------------------

------------------------------------------------------------------------------VDATE

----------------------------------------CDATE-------------------------------------

 

上面這個是抽象圖,我們的目的就是輸入INPUT獲得VDATE,輸入INPUT可以得到CNINP,如果想要INPUT=VDATE,那麼就要讓CNINP=CDATE,而且一開始的時候INPUT和CDATE是相等的.這樣就可以做一個平移了.一直加INPUT的天數,一直到CNINP和CDATE相等的時候就可以獲得我們所要求的VDATE了.在這個平移的過程中要考慮上月份,因爲回有跨月的時候出現,但是不必要帶上年份,因爲就算跨年,只要比較平移獲得的月日相同,目標公曆還是不變的.

  1. procedure TFrmOrder.LDateToGDateClick(Sender: TObject);   
  2. var
  3.   vDate : TDate;
  4. begin
  5.   vDate :=NDateToGDate(CmbYear.text,CmbMonth.text,Cmbday.text);
  6.   CmbYear.Text := inttostr(YearOf(vDate));
  7.   CmbMonth.Text := inttostr(MonthOf(vDate));
  8.   Cmbday.Text := inttostr(DayOf(vDate));
  9.   LDateToGDate.Enabled := False;  
  10. end;

  1. function NDateToGDate(LYear,LMonth,LDay:string):TDate;
  2. const
  3.   CnMonthStr: array[1..12of String = (
  4.     '一''二''三''四''五''六''七''八''九''十',
  5.     '冬''臘');
  6.   CnDayStr: array[1..30of String = (
  7.     '初一''初二''初三''初四''初五',
  8.     '初六''初七''初八''初九''初十',
  9.     '十一''十二''十三''十四''十五',
  10.     '十六''十七''十八''十九''二十',
  11.     '廿一''廿二''廿三''廿四''廿五',
  12.     '廿六''廿七''廿八''廿九''三十');
  13. var
  14.   vDate : TDate;
  15.   vDateStr : string;
  16.   vMonth,vDay,LDate :string;
  17. begin
  18.   Result := Now(); //初始化
  19.   try
  20.     vDate := strtoDate(LYear+'-'+LMonth+'-'+LDay);
  21.     vMonth := CnMonthStr[strtoint(LMonth)]+'月';
  22.     vDay := CnDayStr[strtoint(LDay)];
  23.     LDate := vMonth+vDay;
  24.     While not (LDate = vDateStr) do
  25.     begin
  26.       vDateStr := CnDateOfDateStr(vDate);
  27.       vDate := vDate+1;
  28.     end;
  29.     vDate := vDate - 1;
  30.     Result := vDate;
  31.   except
  32.   on e: exception do
  33.     begin
  34.       Application.MessageBox(Pchar('格式有錯誤,請將農曆改成阿拉伯數字填在相應位置'),'系統提示',MB_OK);
  35.       Exit;
  36.     end;
  37.   end;
  38. end;

小結

在C#中有這個類:System.Globalization.ChineseLunisolarCalendar可以直接從農曆獲得公曆,真是太方便了.

參考MSDN:http://msdn.microsoft.com/zh-cn/library/system.globalization.chineselunisolarcalendar(VS.80).aspx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章