System.DateUtils.EncodeDateTime()
的文档说:
有效小时值为0到24.(如果指定的小时为24,则为 分钟,秒和毫秒值都应为0,并且 结果TDateTime值表示结束时的午夜 指定日期和第二天的开始。)
如果我尝试EncodeDateTime(2008,1,1,24,0,0,0);
,我会收到例外情况。
我做错了什么?
答案 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;
由于HoursPerDay
为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;