我正在建立一个倒计时到某个日期/时间的东西。我有它的工作 - 至少小时,分钟和秒工作正常。我的问题是当我尝试实施天时,它没有给出正确的结果。我知道DateUtils的单元,但那里有很多东西,我不知道该怎么做,特别是因为我数学很糟糕。日期/时间操纵友好的倒计时字符串
我有一个间隔为100的计时器。然后我有一个全球的fDestDT
为目标日期/时间倒计时的基础。在计时器中,我有一个名为DT
的本地TDateTime。然后,我打破它分为多个字符串,并把他们重新走到一起进1“友好”串...
procedure TForm1.TmrTimer(Sender: TObject);
var
DT: TDateTime;
D, H, N, S: String;
Str: String;
begin
DT:= fDestDT - Now; //fDest = destination date/time of countdown
//Need to format only plural numbers with 's'
D:= FormatDateTime('d', DT)+' Days'; //Get number of days
H:= FormatDateTime('h', DT)+' Hours'; //Get number of hours
N:= FormatDateTime('n', DT)+' Minutes'; //Get number of minutes
S:= FormatDateTime('s', DT)+' Seconds'; //Get number of seconds
Str:= D+', '+H+', '+N+', '+S; //Build friendly string
if lblTitle.Caption <> Str then
lblTitle.Caption:= Str; //Update caption only if it's changed
end;
应该出来像...
0 Days, 3 Hours, 1 Minute, 12 Seconds
但相反的日子都出现了错误,当倒计时的日期/时间是今天的日期,它显示30天......
30 Days, 3 Hours, 1 Minute, 12 Seconds
我想,如果我提前一个多月,它也不会正确显示。我如何正确获取天数? DateUtils单元中有没有什么能比我已经更好地自动化大部分工作?编辑: 固定!问题是我很愚蠢地用DT:= fDestDT - Now;
减去,这在我的第一个代码片段中是正确的,但是在转换为使用DateUtils.DaysBetween
代替之后,我需要删除该减法,并且仅设置DT:= Now;
。
工作代码:
procedure TForm1.TmrTimer(Sender: TObject);
var
DT: TDateTime;
Days, Hours, Mins, Secs: Word;
SDays, SHours, SMins, SSecs: String;
Str: String;
begin
DT:= Now;
Days:= DaysBetween(DT, fDestDT);
Hours:= HoursBetween(fDestDT, DT) mod 24; // Remove total days
Mins:= MinutesBetween(DT, fDestDT) mod 60;
Secs := SecondsBetween(DT, fDestDT) mod 60;
if Days = 1 then SDays:= 'Day' else SDays:= 'Days';
if Hours = 1 then SHours:= 'Hour' else SHours:= 'Hours';
if Mins = 1 then SMins:= 'Minute' else SMins:= 'Minutes';
if Secs = 1 then SSecs:= 'Second' else SSecs:= 'Seconds';
Str:= Format('%d '+SDays+' %d '+SHours+' %d '+SMins+' %d '+SSecs,
[Days, Hours, Mins, Secs]);
if lblTime.Caption <> Str then
lblTime.Caption:= Str;
end;
我在这里得到错误的秒数...把它放在一个计时器中,并实时观察输出 - 你会发现它不太正确,秒钟总是出现在30秒以内。 –
是的,秒和分钟应该是'mod 60'而不是'mod 24' –
已经完成了。发布最后评论时必定发生。 :) –