如何计算年龄的xx岁xx月xx日

u010326239 2018-02-06 04:04:31
qq:184237867
//wwl的计算方法begin
DecodeDate(dDate,AYear, AMonth, ADay);
DecodeDate(Now,AYear2, AMonth2, ADay2);
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;
//wwl的计算方法end
...全文
1647 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
DelphixpeFan 2018-02-09
  • 打赏
  • 举报
回复
.....
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;
lyhoo163 2018-02-08
  • 打赏
  • 举报
回复
你的代码,看过了。 1、要考虑超过指定日,月数的累计 2、要考虑月的天数,2月份有26、27、28、29;单双月有30、31天; 3、当月天数,要与实际统一起来。
DelphixpeFan 2018-02-08
  • 打赏
  • 举报
回复
做出个玩具出来了,经测试,接近完美
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.
DelphixpeFan 2018-02-07
  • 打赏
  • 举报
回复
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;
DelphixpeFan 2018-02-07
  • 打赏
  • 举报
回复
比较天数如果为负,同样要判断月份,年份够不够扣,如果在拆年月日之前就判断过了,就无需判断了
DelphixpeFan 2018-02-07
  • 打赏
  • 举报
回复
算法应该是这样的,先比较年份,得到年份的差值,比如nYear,判断条件是>=0,否则弹出日期错误;再比较月份,得到nMonth,如果月份>=0,直接比较天数;否则看nYear是否>=1,<1弹出日期错误;>=1,nYear减1,nMonth+12;再比较天数,如果nDay>=0,得出结论,否则,nMonth-1,nDay+上个月的天数;
lyhoo163 2018-02-07
  • 打赏
  • 举报
回复
你这个有问题: 1、月份天数不是固定的,这样,不能确定X月数。 2、只能如果从Now,向后推,扣整年数后,天数,再推广剩下的月数、天数。

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧