[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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值