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

lok*_*oki 6 delphi

文档System.DateUtils.EncodeDateTime()说:

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

如果我尝试这样做,EncodeDateTime(2008,1,1,24,0,0,0);我会收到一个例外.

我究竟做错了什么?

Dav*_*nan 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;
Run Code Online (Sandbox Code Playgroud)

由于HoursPerDayIS 24,很显然,实现不与文档一致.

这甚至不是随着时间而改变的行为.该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;
Run Code Online (Sandbox Code Playgroud)

  • 文档现已修复. (6认同)