Dnia 2010-09-17, pi? o godzinie 01:55 +0300, Alberto Narduzzi pisze:
Show quoted text 8 lines
Dibo,
> Is there a function in FPC that returns me my local UTC offset?
never tested them, thou' have a look at DateTimeToUnix and
UnixToDateTime, in unit DateUtils
HTH
UnixToDateTime and DateTimeToUnix don't uses any GMT/UTC calculation. They just convert date time just as it is. I search internet for time zone information in delphi and I found this article: http://delphicikk.atw.hu/listaz.php?id=2667&oldal=52
I change his code to free pascal cross platform and this is working function (tested on windows and linux):
uses dateutils, {$IFDEF MSWINDOWS} windows {$ENDIF} {$IFDEF UNIX} unixutil {$ENDIF}
function UniversalTimeToLocal(UT: TDateTime): TDateTime;
var
LT: TDateTime;
TZOffset: Integer;
{$IFDEF MSWINDOWS}
BiasType: Byte;
TZInfo: TTimeZoneInformation;
{$ENDIF}
begin
LT := UT;
{$IFDEF MSWINDOWS}
BiasType := GetTimeZoneInformation(TZInfo);
if (BiasType=0) then begin
Result := UT;
Exit;
end;
// Determine offset in effect for DateTime UT.
if (BiasType=2) then
TZOffset := TZInfo.Bias + TZInfo.DaylightBias
else
TZOffset := TZInfo.Bias + TZInfo.StandardBias;
{$ENDIF}
{$IFDEF UNIX}
TZOffset := -Tzseconds div 60;
{$ENDIF}
// Apply offset.
if (TZOffset > 0) then
// Time zones west of Greenwich.
LT := UT - EncodeTime(TZOffset div 60, TZOffset mod 60, 0, 0)
else if (TZOffset = 0) then
// Time Zone = Greenwich.
LT := UT
else if (TZOffset < 0) then
// Time zones east of Greenwich.
LT := UT + EncodeTime(Abs(TZOffset) div 60, Abs(TZOffset) mod 60, 0,
0);
// Return Local Time.
Result := LT;
end;
Demo:
procedure TForm1.Button1Click(Sender: TObject);
var
d: TDateTime;
begin
// This is unix time 2010-07-26 17:50:17
d := UnixToDateTime(1280166617);
d := UniversalTimeToLocal(d);
// After convert we get 2010-07-26 19:50:17 (Poland GMT + 2h)
Edit1.Text := DateTimeToStr(d);
end;
I am surprised that Free Pascal does not have so basic function. Should I post it on mantis as proposition?
Show quoted text 8 lines