diff --git a/packages/fcl-pdf/src/fppdf.pp b/packages/fcl-pdf/src/fppdf.pp index 2aac25ad46..0ca3ca16fe 100644 --- a/packages/fcl-pdf/src/fppdf.pp +++ b/packages/fcl-pdf/src/fppdf.pp @@ -1294,7 +1294,7 @@ begin fmt := '%.2d:%.2d' else fmt := '%.2d''%.2d'''; - i := GetLocalTimeOffset(ADate); //min + i := GetLocalTimeOffset(ADate, False); //min if i < 0 then Result := '+' else if i = 0 then begin diff --git a/packages/rtl-objpas/src/inc/dateutil.inc b/packages/rtl-objpas/src/inc/dateutil.inc index 214c2828fb..212775196e 100644 --- a/packages/rtl-objpas/src/inc/dateutil.inc +++ b/packages/rtl-objpas/src/inc/dateutil.inc @@ -2257,7 +2257,7 @@ Var begin T:=aValue; if Not aInputisUTC then - T:=IncMinute(T,GetLocalTimeOffset(AValue)); + T:=IncMinute(T,GetLocalTimeOffset(AValue, AInputisUTC)); Result:=Round(DateTimeDiff(RecodeMillisecond(T,0),UnixEpoch)*SecsPerDay); end; @@ -2267,7 +2267,7 @@ Function UnixToDateTime(const AValue: Int64; aReturnUTC : Boolean = true): TDate begin Result:=IncSecond(UnixEpoch, AValue); if Not aReturnUTC then - Result:=IncMinute(Result,-GetLocalTimeOffset(Result)); + Result:=IncMinute(Result,-GetLocalTimeOffset(Result, True)); end; @@ -2668,7 +2668,7 @@ end; function UniversalTimeToLocal(UT: TDateTime): TDateTime; begin - Result:=SysUtils.UniversalTimeToLocal(UT,-GetLocalTimeOffset(UT)); + Result:=SysUtils.UniversalTimeToLocal(UT,-GetLocalTimeOffset(UT, True)); end; function UniversalTimeToLocal(UT: TDateTime; TZOffset : Integer): TDateTime; @@ -2680,7 +2680,7 @@ end; Function LocalTimeToUniversal(LT: TDateTime): TDateTime; begin - Result:=SysUtils.LocalTimeToUniversal(LT,-GetLocalTimeOffset(LT)); + Result:=SysUtils.LocalTimeToUniversal(LT,-GetLocalTimeOffset(LT, False)); end; Function LocalTimeToUniversal(LT: TDateTime;TZOffset: Integer): TDateTime; @@ -2703,7 +2703,7 @@ var Offset: Integer; begin Result := FormatDateTime(FmtUTC, ADate); - Offset := GetLocalTimeOffset(ADate); + Offset := GetLocalTimeOffset(ADate, AInputIsUTC); if AInputIsUTC or (Offset=0) then Result:=Result+'Z' else @@ -2929,7 +2929,7 @@ begin if ReturnUTC then Offset:=0 else - OffSet:=-GetLocalTimeOffset(ADateTime); + OffSet:=-GetLocalTimeOffset(ADateTime, True); aDateTime:=IncMinute(aDateTime,Offset); Result:=True; end; diff --git a/rtl/objpas/sysutils/dati.inc b/rtl/objpas/sysutils/dati.inc index 659d0b6a65..816f0feab7 100644 --- a/rtl/objpas/sysutils/dati.inc +++ b/rtl/objpas/sysutils/dati.inc @@ -1525,15 +1525,15 @@ begin Result:=0; end; -function GetLocalTimeOffset(const DateTime: TDateTime; out Offset: Integer): Boolean; +function GetLocalTimeOffset(const DateTime: TDateTime; const InputIsUTC: Boolean; out Offset: Integer): Boolean; begin Result:=False; end; {$ENDIF} -function GetLocalTimeOffset(const DateTime: TDateTime): Integer; +function GetLocalTimeOffset(const DateTime: TDateTime; const InputIsUTC: Boolean): Integer; begin - if not GetLocalTimeOffset(DateTime, Result) then + if not GetLocalTimeOffset(DateTime, InputIsUTC, Result) then Result:=GetLocalTimeOffset(); end; @@ -1542,7 +1542,7 @@ end; function UniversalTimeToLocal(UT: TDateTime): TDateTime; begin - Result:=UniversalTimeToLocal(UT,-GetLocalTimeOffset(UT)); + Result:=UniversalTimeToLocal(UT,-GetLocalTimeOffset(UT, True)); end; function UniversalTimeToLocal(UT: TDateTime; TZOffset : Integer): TDateTime; @@ -1559,7 +1559,7 @@ end; Function LocalTimeToUniversal(LT: TDateTime): TDateTime; begin - Result:=LocalTimeToUniversal(LT,-GetLocalTimeOffset(LT)); + Result:=LocalTimeToUniversal(LT,-GetLocalTimeOffset(LT, False)); end; Function LocalTimeToUniversal(LT: TDateTime;TZOffset: Integer): TDateTime; diff --git a/rtl/objpas/sysutils/datih.inc b/rtl/objpas/sysutils/datih.inc index e0137de16e..8a25162274 100644 --- a/rtl/objpas/sysutils/datih.inc +++ b/rtl/objpas/sysutils/datih.inc @@ -200,8 +200,8 @@ procedure ReplaceTime(var dati:TDateTime; NewTime : TDateTime); inline; procedure ReplaceDate(var DateTime: TDateTime; const NewDate: TDateTime); inline; function GetLocalTimeOffset: Integer; -function GetLocalTimeOffset(const DateTime: TDateTime; out Offset: Integer): Boolean; -function GetLocalTimeOffset(const DateTime: TDateTime): Integer; +function GetLocalTimeOffset(const DateTime: TDateTime; const InputIsUTC: Boolean; out Offset: Integer): Boolean; +function GetLocalTimeOffset(const DateTime: TDateTime; const InputIsUTC: Boolean = False): Integer; Function FileDateToUTC (Filedate : Int64) : TDateTime; diff --git a/rtl/unix/sysutils.pp b/rtl/unix/sysutils.pp index 1803bf2d04..256931fc8b 100644 --- a/rtl/unix/sysutils.pp +++ b/rtl/unix/sysutils.pp @@ -1620,7 +1620,7 @@ begin Result := -Tzseconds div 60; end; -function GetLocalTimeOffset(const DateTime: TDateTime; out Offset: Integer): Boolean; +function GetLocalTimeOffset(const DateTime: TDateTime; const InputIsUTC: Boolean; out Offset: Integer): Boolean; var Year, Month, Day, Hour, Minute, Second, MilliSecond: word; @@ -1629,7 +1629,10 @@ var begin DecodeDate(DateTime, Year, Month, Day); DecodeTime(DateTime, Hour, Minute, Second, MilliSecond); - UnixTime:=LocalToEpoch(Year, Month, Day, Hour, Minute, Second); + if InputIsUTC then + UnixTime:=UniversalToEpoch(Year, Month, Day, Hour, Minute, Second) + else + UnixTime:=LocalToEpoch(Year, Month, Day, Hour, Minute, Second); { check if time is in current global Tzinfo } if (Tzinfo.validsince0) and (TZInfo.DaylightDate.Month>0) then begin // there is DST + // DaylightDate and StandardDate are local times DSTStart := RelWeekDayToDateTime(TZInfo.DaylightDate); DSTEnd := RelWeekDayToDateTime(TZInfo.StandardDate); + if InputIsUTC then + begin + DSTStart := DSTStart + (TZInfo.Bias+TZInfo.StandardBias)/MinsPerDay; + DSTEnd := DSTEnd + (TZInfo.Bias+TZInfo.DaylightBias)/MinsPerDay; + end; if (DateTime>DSTStart) and (DateTime