Jump to content
Guest

My sample to "COUNTDOWN" between 2 TDateTime values

Recommended Posts

Guest

My sample to "COUNTDOWN" between 2 TDateTime values:

  • the "countdown" to hh:mm:ss it's ok!
  • I not certain about the values is correct to: years, months and days
    • needs more Math for this...

 

image.thumb.png.fa836248a5528d134116eb95750171bf.png

 

source code

implementation

{$R *.dfm}

uses
  System.DateUtils;

var
  lDTFuture: TDateTime;
  lDTnow   : TDateTime;
  //
  lMyFS: TFormatSettings;

procedure TForm2.Button1Click(Sender: TObject);
begin
  lMyFS                := TFormatSettings.Create; // dont needs "Free it"
  lMyFS.LongTimeFormat := 'hh:mm:ss.zzz';         // defining new format for "LongTimeFormat" values when showing it! pass it as "last" param for funtions!
  //
  lDTFuture := StrToDateTimeDef('31/12/2020 00:00:00.000', now, lMyFS); // avoid "AV"
  lDTnow    := StrToDateTimeDef('30/12/2019 23:59:50.000', now, lMyFS); // avoid "AV"
  //
  Timer1.Enabled := true;
end;

procedure TForm2.Timer1Timer(Sender: TObject);
var
  lYears  : word;
  lMonths : word;
  lDays   : word;
  lHours  : word;
  lMinutes: word;
  lSeconds: word;
begin
  if (lDTFuture <= lDTnow) then
  begin
    Timer1.Enabled := false;
    //
    ShowMessage('The time-is-out...');
    //
    exit;
  end;
  //
  Edit2.Text := DateTimeToStr(lDTnow, lMyFS);
  Edit3.Text := DateTimeToStr(lDTFuture, lMyFS);
  //
  // the big problem here with many calculate necessary to verify the values valids: 31days-1 ... = month-1 ... 12month-1 = years-1 etc... verify 28,29,30,31 days 
  // then my minimalisct code was not enought
  lYears   := System.DateUtils.YearsBetween(lDTFuture, lDTnow) mod 1000;
  lMonths  := System.DateUtils.MonthsBetween(lDTFuture, lDTnow) mod 12;
  lDays    := System.DateUtils.DaysBetween(lDTFuture, lDTnow) mod DaysPerYear[System.DateUtils.IsInLeapYear(lDTnow)];
  //
  // here the "countdown" works as expected!
  lHours   := System.DateUtils.HoursBetween(lDTFuture, lDTnow) mod 24;
  lMinutes := System.DateUtils.MinutesBetween(lDTFuture, lDTnow) mod 60;
  lSeconds := System.DateUtils.SecondsBetween(lDTFuture, lDTnow) mod 60;
  //
  Edit1.Text := Format('%d years, %d months, %d days, %d hours, %d minutes, %d seconds', [lYears, lMonths, lDays, lHours, lMinutes, lSeconds]);
  //
  lDTnow := lDTnow + 0.00001; // would be better use "NOW" as current value! // IncSeconds() or MilliSeconds
end;

 

hug

Edited by Guest

Share this post


Link to post
4 hours ago, emailx45 said:

lHours := System.DateUtils.HoursBetween(lDTFuture, lDTnow) mod 24;

Using mod defeat all the purpose.

Assuming now is sunday 08:07 and future is tuesday 09:20 there are 49 hours (Minutes truncated). Your formula will give 1 hour.

Same for all your calculations.

Share this post


Link to post
Guest

to Hours, Minutes and Seconds, it's ok! using "mod" operator! the "countdown" works as expected!

Just Years, Months and Days NOT because the many possibilities in this calculate!

 

image.png.34346792aadc21092289945cc5f4aa49.png   image.thumb.png.347cf72c0286823afcdf69b0df2bd621.png

Edited by Guest

Share this post


Link to post

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×