Delphi でローカル時間を UTC 時間に変換する方法と、UTC からローカル時間に戻す方法を教えてください。質問する

Delphi でローカル時間を UTC 時間に変換する方法と、UTC からローカル時間に戻す方法を教えてください。質問する

私は Delphi を使用しており、UTC 日時を使用してデータベースにレコードを保存し、クライアントがローカルの日時で読み取ったときにそれを復元しようとしています。この前後の変換を行う方法をご存知ですか?

ベストアンサー1

これは、UTC からローカルに変換するために使用する関数です。

function LocalDateTimeFromUTCDateTime(const UTCDateTime: TDateTime): TDateTime;
var
  LocalSystemTime: TSystemTime;
  UTCSystemTime: TSystemTime;
  LocalFileTime: TFileTime;
  UTCFileTime: TFileTime;
begin
  DateTimeToSystemTime(UTCDateTime, UTCSystemTime);
  SystemTimeToFileTime(UTCSystemTime, UTCFileTime);
  if FileTimeToLocalFileTime(UTCFileTime, LocalFileTime) 
  and FileTimeToSystemTime(LocalFileTime, LocalSystemTime) then begin
    Result := SystemTimeToDateTime(LocalSystemTime);
  end else begin
    Result := UTCDateTime;  // Default to UTC if any conversion function fails.
  end;
end;

ご覧のとおり、この関数は UTC の日付時刻を次のように変換します。

  • 日付時刻 -> システム時刻
  • システム時間 -> ファイル時間
  • ファイル時間 -> ローカルファイル時間 (これは UTC からローカルへの変換です)
  • ローカルファイル時間 -> システム時間
  • システム時刻 -> 日付時刻

これを逆転させる方法は明らかであるはずです。


この変換では夏時間もそのまま扱われることに注意してください。現状のままではなく変換時にDateUtils.TTimeZoneXE で導入された type はまさにそれを実現しようとします。コードは次のようになります。

LocalDateTime := TTimeZone.Local.ToLocalTime(UniversalDateTime);

反対方向には を使用しますToUniversalTime

このクラスは(大まかに).netをモデルにしているようですTimeZoneクラス。

警告の言葉。試み変換する時点での夏時間を考慮して 100% 正確にすることは不可能です。少なくともタイムマシンがなければ、それを実現するのは不可能です。そして、それは未来の時代だけを考慮した話です。過去の時代でさえ複雑です。レイモンド・チェンはここでこの問題について論じています。サマータイムが直感的でない理由

おすすめ記事