1. 程式人生 > >通過生日計算X歲X月X天,並計算距離生日的天數

通過生日計算X歲X月X天,並計算距離生日的天數

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.