通過生日計算X歲X月X天,並計算距離生日的天數
阿新 • • 發佈:2019-01-24
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, DateUtils, StdCtrls, ComCtrls; type TForm1 = class(TForm) DateTimePicker1: TDateTimePicker; Button1: TButton; Edit1: TEdit; Edit2: TEdit; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var dDate: TDateTime; AYear, AMonth, ADay, AYear2, AMonth2, ADay2: Word; iYear, iMonth, iDay, nMonth, nDay, iBirthDay: Integer; begin dDate := DateTimePicker1.DateTime; if dDate > Now then begin Edit1.Text := '日期非法'; Edit2.Text := '出生日期大於當前日期'; Exit; end; 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; 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(Now, 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(Now) then iBirthDay:=DaysBetween(Now, EncodeDate(AYear2, AMonth, ADay)) else iBirthDay:=DaysBetween(Now, EncodeDate(AYear2 + 4, AMonth, ADay)); end else begin iBirthDay:=DaysBetween(Now, EncodeDate(AYear2 + 4 - (AYear2 mod 4), AMonth, ADay)); end; end else begin if EncodeDate(AYear2, AMonth, ADay) >= Trunc(Now) then iBirthDay:=DaysBetween(Now, EncodeDate(AYear2, AMonth, ADay)) else iBirthDay:=DaysBetween(Now, EncodeDate(AYear2 + 1, AMonth, ADay)); end; Edit2.Text := Format('距離生日%d天', [iBirthDay]); end; end.