私は 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.TTimeZone
XE で導入された type はまさにそれを実現しようとします。コードは次のようになります。
LocalDateTime := TTimeZone.Local.ToLocalTime(UniversalDateTime);
反対方向には を使用しますToUniversalTime
。
このクラスは(大まかに).netをモデルにしているようですTimeZone
クラス。
警告の言葉。試み変換する時点での夏時間を考慮して 100% 正確にすることは不可能です。少なくともタイムマシンがなければ、それを実現するのは不可能です。そして、それは未来の時代だけを考慮した話です。過去の時代でさえ複雑です。レイモンド・チェンはここでこの問題について論じています。サマータイムが直感的でない理由。