How to convert Local time to UTC time in Delphi? and how to convert it back from UTC to local time?
datetime, delphi, delphi-xe2, time, utc
Solution
This is the function that I use to convert from UTC to local.
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;
As you can see the function transforms the UTC date time as follows:
- Date time -> system time
- System time -> file time
- File time -> local file time (this is the conversion from UTC to local)
- Local file time -> system time
- System time -> date time
It should be obvious how to reverse this.
Note that this conversion treats daylight saving as it is now rather than as it is/was at the time being converted. The `DateUtils.TTimeZone` type, introduced in XE, attempts to do just that. The code becomes:
LocalDateTime := TTimeZone.Local.ToLocalTime(UniversalDateTime);
In the other direction use `ToUniversalTime`.
This class appears to be (loosely) modelled on the .net `TimeZone` class.
A word of warning. Do not expect the attempt to account for daylight savings at the time being converted to be 100% accurate. It is simply impossible to achieve that. At least without a time machine. And that's just considering times in the future. Even times in the past are complex. Raymond Chen discusses the issue here: Why Daylight Savings Time is nonintuitive.
Problem
I'm using Delphi and I'm trying to store records using UTC datetime in my database and then restore it back when a client reads it in his local datetime ? any idea how to do this forth back conversion ?