Perl時間をDelphiのTDateTimeに変換

Perlのtime関数で取得できる時間をDelphiのTDateTimeに変換する関数です。逆にTDateTimeをPerlの時間に変換する関数も作ります。

Perlのtime関数で取得できる時間は1970年1月1日からの経過した秒数になっています。これをDelphiのTDateTimeに変換するにはEncodeDate(1970, 1, 1);としてPerlの初期時間を作成し、その結果に対してPerl時間を1日の秒数で除算した値を加算します。
ただし、Perlのtime関数が返す時間は世界標準時(UTC)なので除算を行う前にローカル時間に合わせる作業が必要になります。

UTCと現在のローカル時間との差を取得するにはAPIのGetTimeZoneInformationを使います。

type
  TPerlTime = Cardinal;

function _GetBias: Integer;
var
  TimeZone: TTimeZoneInformation;
begin
  if GetTimeZoneInformation(TimeZone) = $FFFFFFFF then
    RaiseLastWin32Error;
  Result := TimeZone.Bias * 60;//分単位から秒単位に変換
  //符号を反転
  Result := Result * -1;
end;

function PerlTimeToDateTime(PerlTime: TPerlTime): TDateTime;
begin
  PerlTime := PerlTime + _GetBias;
  Result := EncodeDate(1970, 1, 1) + (PerlTime / 86400);
end;

function DateTimeToPerlTime(DateTime: TDateTime): TPerlTime;
var
  Bias: Integer;
begin
  Result := Round((DateTime - EncodeDate(1970, 1, 1)) * 86400) ;
  Bias := _GetBias;
  if Bias > 0 then
    Result := Result - Bias
  else
    Result := Result + Bias;
end;

Copyright 2001 Rinka Kouzuki All Rights Reserved.