来自Embarcadero的文档对于EncodeDateTime是错误的吗?

时间:2018-03-29 13:47:44

标签: delphi

System.DateUtils.EncodeDateTime()的文档说:

  

有效小时值为0到24.(如果指定的小时为24,则为   分钟,秒和毫秒值都应为0,并且   结果TDateTime值表示结束时的午夜   指定日期和第二天的开始。)

如果我尝试EncodeDateTime(2008,1,1,24,0,0,0);,我会收到例外情况。

我做错了什么?

1 个答案:

答案 0 :(得分:7)

这是文档中的缺陷。 TryEncodeTime的实现,实际工作是这样的:

function TryEncodeTime(Hour, Min, Sec, MSec: Word; out Time: TDateTime): Boolean;
var
  TS: TTimeStamp;
begin
  Result := False;
  if (Hour < HoursPerDay) and (Min < MinsPerHour) and (Sec < SecsPerMin) 
    and (MSec < MSecsPerSec) then
  begin
    ....
    Result := True;
  end;
end;

由于HoursPerDay24,很明显该实施与文档不一致。

这种行为随着时间的推移而变化。 TryEncodeTime方法始终以这种方式运行。例如,Delphi 5的类似功能如下所示:

function DoEncodeTime(Hour, Min, Sec, MSec: Word; var Time: TDateTime): Boolean;
begin
  Result := False;
  if (Hour < 24) and (Min < 60) and (Sec < 60) and (MSec < 1000) then
  begin
    Time := (Hour * 3600000 + Min * 60000 + Sec * 1000 + MSec) / MSecsPerDay;
    Result := True;
  end;
end;