[Delphi]将农历转换为公历的算法
2008-12-05 16:57
471 查看
这两个过程是在应用单元中的,必须包含一个先成的单元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了.在这个平移的过程中要考虑上月份,因为回有跨月的时候出现,但是不必要带上年份,因为就算跨年,只要比较平移获得的月日相同,目标公历还是不变的.
procedure TFrmOrder.LDateToGDateClick(Sender: TObject);
var
vDate : TDate;
begin
vDate :=NDateToGDate(CmbYear.text,CmbMonth.text,Cmbday.text);
CmbYear.Text := inttostr(YearOf(vDate));
CmbMonth.Text := inttostr(MonthOf(vDate));
Cmbday.Text := inttostr(DayOf(vDate));
LDateToGDate.Enabled := False;
end;
function NDateToGDate(LYear,LMonth,LDay:string):TDate;
const
CnMonthStr: array[1..12] of String = (
'一', '二', '三', '四', '五', '六', '七', '八', '九', '十',
'冬', '腊');
CnDayStr: array[1..30] of String = (
'初一', '初二', '初三', '初四', '初五',
'初六', '初七', '初八', '初九', '初十',
'十一', '十二', '十三', '十四', '十五',
'十六', '十七', '十八', '十九', '二十',
'廿一', '廿二', '廿三', '廿四', '廿五',
'廿六', '廿七', '廿八', '廿九', '三十');
var
vDate : TDate;
vDateStr : string;
vMonth,vDay,LDate :string;
begin
Result := Now(); //初始化
try
vDate := strtoDate(LYear+'-'+LMonth+'-'+LDay);
vMonth := CnMonthStr[strtoint(LMonth)]+'月';
vDay := CnDayStr[strtoint(LDay)];
LDate := vMonth+vDay;
While not (LDate = vDateStr) do
begin
vDateStr := CnDateOfDateStr(vDate);
vDate := vDate+1;
end;
vDate := vDate - 1;
Result := vDate;
except
on e: exception do
begin
Application.MessageBox(Pchar('格式有错误,请将农历改成阿拉伯数字填在相应位置'),'系统提示',MB_OK);
Exit;
end;
end;
end;
小结
在C#中有这个类:System.Globalization.ChineseLunisolarCalendar可以直接从农历获得公历,真是太方便了.
参考MSDN:http://msdn.microsoft.com/zh-cn/library/system.globalization.chineselunisolarcalendar(VS.80).aspx
先说下这个算法的大概思路:
单元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了.在这个平移的过程中要考虑上月份,因为回有跨月的时候出现,但是不必要带上年份,因为就算跨年,只要比较平移获得的月日相同,目标公历还是不变的.
procedure TFrmOrder.LDateToGDateClick(Sender: TObject);
var
vDate : TDate;
begin
vDate :=NDateToGDate(CmbYear.text,CmbMonth.text,Cmbday.text);
CmbYear.Text := inttostr(YearOf(vDate));
CmbMonth.Text := inttostr(MonthOf(vDate));
Cmbday.Text := inttostr(DayOf(vDate));
LDateToGDate.Enabled := False;
end;
function NDateToGDate(LYear,LMonth,LDay:string):TDate;
const
CnMonthStr: array[1..12] of String = (
'一', '二', '三', '四', '五', '六', '七', '八', '九', '十',
'冬', '腊');
CnDayStr: array[1..30] of String = (
'初一', '初二', '初三', '初四', '初五',
'初六', '初七', '初八', '初九', '初十',
'十一', '十二', '十三', '十四', '十五',
'十六', '十七', '十八', '十九', '二十',
'廿一', '廿二', '廿三', '廿四', '廿五',
'廿六', '廿七', '廿八', '廿九', '三十');
var
vDate : TDate;
vDateStr : string;
vMonth,vDay,LDate :string;
begin
Result := Now(); //初始化
try
vDate := strtoDate(LYear+'-'+LMonth+'-'+LDay);
vMonth := CnMonthStr[strtoint(LMonth)]+'月';
vDay := CnDayStr[strtoint(LDay)];
LDate := vMonth+vDay;
While not (LDate = vDateStr) do
begin
vDateStr := CnDateOfDateStr(vDate);
vDate := vDate+1;
end;
vDate := vDate - 1;
Result := vDate;
except
on e: exception do
begin
Application.MessageBox(Pchar('格式有错误,请将农历改成阿拉伯数字填在相应位置'),'系统提示',MB_OK);
Exit;
end;
end;
end;
小结
在C#中有这个类:System.Globalization.ChineseLunisolarCalendar可以直接从农历获得公历,真是太方便了.
参考MSDN:http://msdn.microsoft.com/zh-cn/library/system.globalization.chineselunisolarcalendar(VS.80).aspx
相关文章推荐
- 用Delphi处理公历到农历的转换
- 公历转换成农历算法
- 公历转换农历的算法(JavaScript)
- 用Delphi处理公历到农历的转换
- 用Delphi处理公历到农历的转换
- 公历转换农历的算法(JavaScript)
- 公历转换农历算法
- 用Delphi处理公历到农历的转换
- 公历转换农历的算法(JavaScript)
- 公历转换中国农历的算法--ChineseCalendarGB.java
- 公历和农历之间如何转换?
- 分享一个公历转农历的算法
- PHP汉字拼音转换和公历农历转换(代码家园)
- 新历(公历、西历)转换农历(精确…
- 公历转换为农历
- [Delphi]公历到农历的转换法
- 使用ChineseLunisolarCalendar类转换公历和农历日期
- 公历转换成农历的C#函数
- PHP实现的汉字拼音转换和公历农历转换类及使用示例
- 公历日期与农历日期的相互转换程序