[fpc-devel] Problem with Now() and time changed by ntpd
Michael Van Canneyt
michael at freepascal.org
Tue Nov 1 19:18:38 CET 2011
On Tue, 1 Nov 2011, zeljko wrote:
>
>
> > We'll simply need to store the next moment when the DST correction changes,
>
> > compare the result of gettimeofday with that and re-base the time
>
> > calculation. If we decide to add some check for the timestamp of the
>
> > timezone file - that would make Date(), Time() and Now() VERY expensive
>
> > operations.
>
>
> IMO, better correct and slow than incorrect and fast (especially in this case , since 24/7 apps compiled with fpc aren't 24/7 apps anymore).
>
>
> At least this must be documented in fpc until it's fixed or provided some kind of workaround, eg that our 24/7 service (or any other app - doesn't matter
> at all) can trigger rtl from time to time to read tzdata.
>
>
> eg. imagine bool FpReadTZDataNextTime: Boolean = False; (global variable).
>
> when we call fpgettimeofday() we check if FpReadTZDataNextTime is false/true.
It will be something like that, yes. I was thinking of introducing a
CheckRefreshTZInfoInterval: integer;
-1 : never check for refresh (current behaviour)
0 : refresh on each call (like LibC, will be new default)
>0 : Only refresh every N [yourfavouriteinterval].
But of course not in fpgettimeofday, in EpochToLocalTime. I repeat:
fpgettimeofday returns UTC time, it does not need to read timezone info.
It is the step which converts this time to local time that must re-read the timezone files if needed.
(EpochToLocalTime, the equivalent of localtime_r in libc)
However, meanwhile:
1. You can force a re-calculation of DST with the call (unix unit):
GetLocalTimezone(fptime);
This will not refresh the TZ data from file, but will re-calculate the DST settings.
2. You can force a re-read of the timezone file with (unix unit):
ReadTimezoneFile(GetTimezoneFile);
Then you must still do the recalculation of DST.
These calls were already present in the RTL.
3. A more simple mechanism is using the (newly added) ReReadTimeZone (unix unit):
ReReadTimeZone;
Which will re-read TZ and re-calculate DST settings all in one go.
I added this in revision 19569. The idea is that the new 'automation'
mechanism will call this routine.
Michael.
More information about the fpc-devel
mailing list