Delphi 四舍五入到最接近的15分钟

Delphi 四舍五入到最接近的15分钟,delphi,delphi-xe2,Delphi,Delphi Xe2,我有以下函数,我被引导相信应该将时间四舍五入到最接近的15分钟 function TdmData.RoundTime(T: TTime): TTime; var h, m, s, ms : Word; begin DecodeTime(T, h, m, s, ms); m := (m div 15) * 15; s := 0; Result := EncodeTime(h, m, s, ms); end; 为了测试该功能,我在表单上放置了一个tbutton和一个tedit,点击

我有以下函数,我被引导相信应该将时间四舍五入到最接近的15分钟

function TdmData.RoundTime(T: TTime): TTime;
var h, m, s, ms : Word;
begin
  DecodeTime(T, h, m, s, ms);
  m := (m div 15) * 15;
  s := 0;
  Result := EncodeTime(h, m, s, ms);
end;
为了测试该功能,我在表单上放置了一个tbutton和一个tedit,点击按钮后,我执行以下操作:

begin
  Edit1.Text := RoundTime('12:08:27');
end;
编译时出错:“TTime和string类型不兼容”

这方面的任何帮助都会很好


谢谢,

导致编译失败的错误是您将
字符串
传递给需要
TTime
作为参数的函数。
修复后,
Edit1.Text
需要
string
类型,但函数返回
TTime

使用和,您可以从
字符串
类型获得所需的转换

您的函数可以这样调用:

begin
  Edit1.Text := TimeToStr(RoundTime(StrToTime('12:08:27'));
end;

窃取的答案--您可以获得一个日期,该日期四舍五入到分配给
interval
参数的任意最近值:

function RoundToNearest(time, interval: TDateTime): TDateTime;
var
  time_sec, int_sec, rounded_sec: int64;
begin
  time_sec := Round(time * SecsPerDay);
  int_sec := Round(interval * SecsPerDay);
  rounded_sec := (time_sec div int_sec) * int_sec;
  if ((rounded_sec + int_sec - time_sec) - (time_sec - rounded_sec)) > 0 then
    rounded_sec := rounded_sec + time_sec + int_sec;
  Result := rounded_sec / SecsPerDay;
end;


'12:08:27'
属于
字符串类型
嗯,字符串不是
TTime
。您的代码不会舍入到最近的值,而是截断。没有
TString
这样的东西,当人们编造错误消息时,这是令人沮丧的。考虑从一个字符串转换为一个时间。看来,您缺少一些对数据类型的体验。请参阅此概述,了解Delphi中如何使用数据类型:日期和时间类型是浮点数的特例。这里描述了它们:
begin
  Edit1.Text := TimeToStr(RoundToNearest(StrToTime('12:08:27'), StrToTime('0:0:15')));
end;