dinsdag 16 oktober 2007

“Now” functie is niet betrouwbaar! (ivm zomer/winter tijd)

In Delphi geeft de functie “Now” de lokale tijd terug. Dit is dus de gecorrigeerde tijd ten opzicht van de GMT of UTC tijd. Oftewel: de lokale tijd is de tijd rechtsonderin op de taakbalk.
Deze tijd is onderhevig aan zomer/winter tijd aanpassingen, wat al dan niet automatisch door Windows wordt aangepast…

Deze functie is dus niet betrouwbaar om de tijd te meten tussen 2 tijdstippen:
je hebt nl een kleine kans (van 2x 1 uur per jaar) dat de tijd 1 uur vooruit of achteruit verspringt ivm zomer/winter tijd. Vooral als kritische onderdelen van je programma hiervan gebruik maakt, is dit belangrijk om te weten!

Oplossing hiervoor is om gebruik te maken van de “GetSystemTime” API van Windows, en niet de “GetLocalTime” die voor “Now” gebruikt wordt.
Ik heb hiervoor een “NowUTC” functie gemaakt:

function NowUTC: TDatetime;
var
SystemTime: TSystemTime;
begin
GetSystemTime(SystemTime);
Result := SystemTimeToDateTime(SystemTime);
end;

Voor wat extra achtergrond informatie:

  • Windows slaat zowieso intern alle tijden als “local” time op. Dus bestanden, logs, etc. Tijdens zomer/winter tijd wissel kan het dus voorkomen dat een bestand opeens 1 uur te oud of zelfs 1 uur te jong (in de toekomst) is! Zie KB van Microsoft:
    “Time stamp changes with daylight savings”

    http://support.microsoft.com/kb/q129574/
  • De “SetLocalTime” API moet je 2x aanroepen om de PC tijd goed aan te passen. De eerste keer wordt nl de tijd eerst gecorrigeerd ten aanzien van de huidige tijd (dus 1 uur erop/eraf als je meer dan een half jaar veranderd) en kan dus 1 uur afwijken. De tweede keer zit je wel in goede winter/zomer tijd zone, en wordt de tijd wel goed gezet.
    Zie KB van Microsoft:
    “SetLocalTime/GetLocalTime Not the Same if Adjusting for Daylight Saving Time”
    http://support.microsoft.com/kb/q234735/
  • Leuk om te melden :-) dat Unix/Linux de tijd intern wel goed geregeld heeft:
    alles is intern GMT/UTC tijd, zodat het geen last heeft van de bovenstaande *kuch* features *kuch* van Windows. Zelfs Windows Vista heeft nog steeds de antieke en onbetrouwbare MS-DOS tijds bepaling! Meer informatie hierover:
    “IBM PC Real Time Clock should run in UT”
    http://www.cl.cam.ac.uk/~mgk25/mswish/ut-rtc.html

Geen opmerkingen: