plorer\
2.x\DBXForm\TwoDigitYearCenturyWindow".
---- 如果将TwoDigitYearCenturyWindow变为0,那么 Delphi3、Delphi4、Delphi5 对日期的解释都将一模一样只处理两位数年份。
---- J-MIDAS (Java Midas) 和 J-TClientDataSet 是依靠 JBUILDER 引擎对日期格式进行解释,所以对两位数的年份,JBUILDER 只保留了 20 年的有效期。
---- 现在回头来看一下 Delphi 3。由于先天不足,对仍还在使用他的
程序员们来说,多少是有些失望。不过,如果进行一番改造,再把 BDE 升级到 5.1 以上,或用 ADO 2.1 代替 BDE,还是可以正常在低档机上披星戴月,披挂上阵。
---- 我们先看一下 Delphi 3 中对年份处理的 EraToYear 函数。该函数返回一符号整形值。定义如下:
function EraToYear(Year: Integer): Integer;
begin
if SysLocale.PriLangID = LANG_KOREAN then
begin
if Year <= 99 then
Inc(Year, (CurrentYear + Abs
(EraYearOffset)) div 100 * 100);
if EraYearOffset > 0 then
EraYearOffset := -EraYearOffset;
end
else
Dec(EraYearOffset);
Result := Year + EraYearOffset;
end;
---- 我们看到,Delphi 对 2000 年并未加以考虑,其中 Year 获取年份的后两位。这样的话,到了2000 年,日期将回到从前。故而,必须将此函数加以修改,以便使我们的日期转换能通过2000 年。首先,按照 Delphi 一贯的兼容性做法,应该在单元头部声明一 TwoDigitCenturyWindow 的 Byte 变量。在单元初试化时(initialization),把其附值为 50。其次,对 EraToYear 做如下改动:
function EraToYear(Year: Integer): Integer;
begin
if SysLocale.PriLangID = LANG_KOREAN then
begin
if Year <= 99 then
Begin
if Year > TwoDigitYearCenturyWindow then
Inc(Year, (CurrentYear + Abs(EraYearOffset))
div 100 * 100)
else
Inc(Year, (2000 + Abs(EraYearOffset))
div 100 * 100);
end;
if EraYearOffset > 0 then
EraYearOffset := -EraYearOffset;
end
else
Dec(EraYearOffset);
Result := Year + EraYearOffset;
end;
---- 然后对 ScanDate 函数做相应的处理,以使其适应 2000 年过度。
function ScanDate(const S: string; var Pos: Integer;
var Date: TDateTime): Boolean;
var
DateOrder: TDateOrder;
N1, N2, N3, Y, M, D: Word;
EraName : string;
EraYearOffset: Integer;
..
begin
Y := 0;
M := 0;
D := 0;
Result := False;
DateOrder := GetDateOrder(ShortDateFormat);
EraYearOffset := 0;
if ShortDateFormat = ''g'' then
// skip over prefix text
begin
ScanToNumber(S, Pos);
EraName := Trim(Copy(S, 1, Pos-1));
EraYearOffset := GetEraYearOffset(EraName);
end
else
if AnsiPos(''e'', ShortDateFormat) > 0 then
EraYearOffset := EraYearOffsets;
if not (ScanNumber(S, Pos, N1) and ScanChar(S,
Pos, DateSeparator) and
ScanNumber(S, Pos, N2)) then Exit;
if ScanChar(S, Pos, DateSeparator) then
begin
if not ScanNumber(S, Pos, N3) then Exit;
case DateOrder of
if not ScanNumber(S, Pos, N3) then Exit;
case DateOrder of
doMDY: begin Y := N3; M := N1; D := N2; end;
doDMY: begin Y := N3; M := N2; D := N1; end;
doYMD: begin Y := N1; M := N2; D := N3; end;
end;
if EraYearOffset > 0 then Y := EraToYear(Y);
{ 在这里 Century Window 发挥作用 }
if Y <= 99 then
Begin
if Y > TwoDigitYearCenturyWindow then
Inc(Y, CurrentYear div 100 * 100)
else
Inc(Y, 2000);
end;
end else
..
---- 由此,Delphi 3 已经可以渡过 2000 年了,不过,Inprise 建议 De