通过生日计算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.
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值