5,392
社区成员
发帖
与我相关
我的任务
分享
.....
nDay := DayOfTheMonth(EndOfTheMonth(EncodeDate(AYear, nMonth, 1)));
//-------------如果上月的天数比生日的天数少,则取0,如果实在纠结这几天,可以把下面代码换成iDay := ADay2 +abs( nDay - ADay);
if ADay > nDay then
iDay := ADay2
else
iDay := ADay2 + nDay - ADay;
//---------
end;
unit UnitMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DateUtils, StdCtrls, ComCtrls;
type
TFormMain = class(TForm)
DateTimePicker1: TDateTimePicker;
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
procedure Button1Click(Sender: TObject);
procedure MyGetLunarHolDay;
private
{ Private declarations }
public
{ Public declarations }
end;
var
FormMain: TFormMain;
implementation
uses DateCn, UGL2NLdatae;
{$R *.dfm}
procedure TFormMain.MyGetLunarHolDay;
var
i: Integer;
s: string;
begin
s := GetLunarHolDay(DateTimePicker1.Date);
if s <> '' then
Label2.Caption := format('节气:今天[%s]', [s])
else
begin
for i := 1 to 20 do
begin
s := GetLunarHolDay(DateTimePicker1.Date - i);
if s <> '' then
begin
Label2.Caption := format('节气:当天 [%s] 第 %d 天', [s, i + 1]);
Break;
end;
end;
end;
for i := 1 to 20 do
begin
s := GetLunarHolDay(DateTimePicker1.Date + i);
if s <> '' then
begin
Label3.Caption := format('下一节气:[%s] %d 天后', [s, i]);
Break;
end;
end;
end;
procedure TFormMain.Button1Click(Sender: TObject);
var
dDate, dDateTarg: TDateTime;
AYear, AMonth, ADay, AYear2, AMonth2, ADay2: Word;
iYear, iMonth, iDay, nMonth, nDay, iBirthDay: Integer;
begin
dDate := DateTimePicker1.DateTime;
dDateTarg := Trunc(Now);
DecodeDate(dDate, AYear, AMonth, ADay);
DecodeDate(dDateTarg, AYear2, AMonth2, ADay2);
if (AYear > 1900) and (AYear <= 2050) then
begin
Label1.Caption := format('农历:%s', [CnDateOfDateStr(DateTimePicker1.Date)]);
MyGetLunarHolDay;
end
else
Label1.Caption := format('农历:%s', ['超出查询范围!']);
if dDate > Now then
begin
Edit1.Text := '日期非法,出生日期大于当前日期';
Edit2.Text := format('距离当前时间:%d天', [DaysBetween(dDateTarg, Trunc(DateTimePicker1.Date))]);
Exit;
end;
iYear := AYear2 - AYear; // 计算岁数
iMonth := AMonth2 - AMonth; // 相差月份
if iMonth < 0 then
begin
iYear := iYear - 1;
iMonth := iMonth + 12;
end;
iDay := ADay2 - ADay; // 相差天数
if iDay < 0 then
begin
iMonth := iMonth - 1;
if iMonth < 0 then
begin
iYear := iYear - 1;
iMonth := iMonth + 12;
end;
if AMonth2 = 1 then
nMonth := 12
else
nMonth := AMonth2 - 1;
nDay := DayOfTheMonth(EndOfTheMonth(EncodeDate(AYear, nMonth, 1)));
if ADay > nDay then
iDay := ADay2
else
iDay := ADay2 + nDay - ADay;
end;
// iDay := ADay2 - ADay;
// if iDay < 0 then
// begin
// iMonth := iMonth - 1;
// if iMonth < 0 then
// begin
// iYear := iYear - 1;
// iMonth := iMonth + 12;
// iDay:=ADay2;
// end;
// end;
//
// if (iYear = 0) and (iMonth = 0) then
// iDay:= DaysBetween(dDateTarg, dDate);
Edit1.Text := format('%d岁%d月%d天', [iYear, iMonth, iDay]);
// 计算距离生日的天数
if (AMonth = 2) and (ADay = 29) then // 2月29日特殊处理
begin
if (AYear2 mod 4) = 0 then
begin
if EncodeDate(AYear2, AMonth, ADay) >= Trunc(dDateTarg) then
iBirthDay := DaysBetween(dDateTarg, EncodeDate(AYear2, AMonth, ADay))
else
iBirthDay := DaysBetween(dDateTarg, EncodeDate(AYear2 + 4, AMonth, ADay));
end
else
begin
iBirthDay := DaysBetween(dDateTarg, EncodeDate(AYear2 + 4 - (AYear2 mod 4), AMonth, ADay));
end;
end
else
begin
if EncodeDate(AYear2, AMonth, ADay) >= Trunc(dDateTarg) then
iBirthDay := DaysBetween(dDateTarg, EncodeDate(AYear2, AMonth, ADay))
else
iBirthDay := DaysBetween(dDateTarg, EncodeDate(AYear2 + 1, AMonth, ADay));
end;
Edit2.Text := format('距离生日%d天', [iBirthDay]);
end;
end.
procedure TForm1.Button1Click(Sender: TObject);
var
dDate: TDateTime;
AYear, AMonth, ADay, AYear2, AMonth2, ADay2: Word;
iYear, iMonth, iDay, nMonth, nday: Integer;
begin
dDate := DateTimePicker1.DateTime;
if dDate > Now then
Exit;
DecodeDate(dDate, AYear, AMonth, ADay);
DecodeDate(Now, AYear2, AMonth2, ADay2);
iYear := AYear2 - AYear;
iMonth := AMonth2 - AMonth;
if iMonth < 0 then
begin
iYear := iYear - 1;
iMonth := iMonth + 12;
end;
iDay := ADay2 - ADay;
if iDay < 0 then
begin
iMonth := iMonth - 1;
if iMonth < 0 then
begin
iYear := iYear - 1;
iMonth := iMonth + 12;
iDay:=ADay2;
end;
end;
if (iYear = 0) and (iMonth = 0) then
iDay:= DaysBetween(Now, dDate);
Edit1.Text := Format('%d岁%d月%d天', [iYear, iMonth, iDay]);
// iYear := YearsBetween(Now, dDate);
// nMonth := MonthsBetween(Now, dDate);
// nday := DaysBetween(Now, dDate);
// iYear := nMonth div 12; // 相差年份
// if nMonth > 12 then
// AYear := AYear + iYear;
//
// dDate := EncodeDate(AYear, AMonth, ADay);
// nMonth := MonthsBetween(Now, dDate); // 相差月份
// iMonth := nMonth; // 剩下月份
//
// if nMonth < 12 then
// if nMonth < 12 - AMonth then
// AMonth := AMonth + nMonth;
// if nMonth > 12 - AMonth then
// begin
//
// AMonth := nMonth - (12 - AMonth);
// if AMonth > 12 then
// AMonth := AMonth - 12;
// AYear := AYear + 1;
// end;
//
// dDate := EncodeDate(AYear, AMonth, ADay);
//
// iDay := DaysBetween(Now, dDate);
//
// if AYear > 3000 then
// AYear := AYear2;
//
// if AMonth >= 12 then
// AMonth := 0;
// if ADay > 30 then
// ADay := 0;
//
// if iMonth < 0 then
// iMonth := 0;
// if iDay < 0 then
// iDay := 0;
end;