Visual Basic - Technik, FAQ, Tricks, Beispiele

Home / Allgemein / Zeit / DateAdd

Datum und Zeit (schnell!) addieren

Einleitung

Die in VB eingebaute DateAdd-Funktion erlaubt es, zu einem Datum/Zeit-Wert ein bestimmtes Intervall zu addieren. So wird im folgenden Beispiel zu einer Date-Variablen 5 Minuten ("n", s.a. VB-Hilfe für Intervall-Strings) addiert:

t = DateAdd("n", 5, t)

Hintergrund

Date-Variablen werden intern als Fließkommazahlen gespeichert: Der Vorkomma-Anteil gibt an, wieviele Tage seit dem 30.12.1899 ("Tag 0") vergangen sind, der Nachkomma-Anteil enthält die Uhrzeit als "Tagesanteil". D.h., dass z.B. 0 Mitternacht ("00:00") entspricht, und 0,5 gerade Mittag ("12:00").

Anschauen kann man sich dies, wenn man die CDbl-Funktion benutzt, um einen Datumswert als Zahl darzustellen: So gibt CDbl(Now) am 20.02.2002 um genau 18:00 den Wert 37307,75 zurück.

Idee

Jetzt könnte man auf die Idee kommen, die DateAdd-Funktion durch eine einfache Addition zu ersetzen. Dann müßten doch folgende zwei Zeilen (Addition von einem Tag) äquivalent sein:

t = #2002/2/20#
Print DateAdd("d", 1, t) 'ergibt 21.2.2002
Print t + 1              'ergibt 21.2.2002

Tatsächlich, beide Varianten liefern das selbe Ergebnis! Doch welche Variante ist besser bzw. schneller?

Performance

Ich habe mir mal die Mühe gemacht, die Laufzeiten der beiden oben gezeigten Varianten bei verschiedenen Kompilier-Methoden zu messen (WinNT4 SP6, VB5 SP3, P3 600Mhz). Heraus kamen folgende Resultate (für jeweils 1.000.000 Durchläufe):

KompilatDateAdd("n", 5, t)t + 5 * ConstMinuteBemerkung
IDE87,11 s1,71 sEntwicklungsumgebung: Faktor 51
P-Code87,11 s1,27 sInterpretiert: Faktor 69
Native82,81 s0,80 s"Echt" kompiliert: Faktor 104
Optimiert83,05 s0,45 sAlle Compiler-Optionen auf Speed: Faktor 185
Resumee: Die konventionelle arithmetische Addition ist (je nach VB-Kompilat) 50 bis 185 mal schneller als die DateAdd-Funktion! Oder anders ausgedrückt: Während DateAdd einmal ausgeführt wird, können 185 Additionen gemacht werden! Zur Erinnerung: Beidesmal mit dem gleichen Ergebnis!

Code / Quelltext

Um die Zeit-Addition komfortabel (und sprechend) nutzen zu können, empfehle ich folgende Konstanten zu verwenden (am Besten im Deklarationsteil eines Moduls einbinden):

Const cDatePartWeek As Single = 7
Const cDatePartDay As Single = 1
Const cDatePartHour As Single = 1 / 24
Const cDatePartMinute As Single = 1 / (24 * 60)
Const cDatePartSecond As Single = 1 / (24 * 60 * 60&)

Wenn dann z.B. 5 Minuten addiert werden müssen, kann dies einfach so geschrieben werden:

t = t + 5 * cDatePartMinute

Tipp: Bei besonders Zeit-kritischen Code-Abschnitten kann die obige Performance sogar noch um bis zu 50% verbessert werden. Verwenden Sie einfach eine selbst-definierte Konstante, die gerade dem gewünschten Zeit-Abschnitt entspricht, so dass die Multiplikation entfallen kann. Beispiel (Addition von 5 Minuten):

Const c5Minutes As Single = 5 * cDatePartMinute
t = t + c5Minutes

Probleme

Die oben gezeigte schnelle Methode versagt bei der Addition von Monaten und Jahren, da diese unterschiedlich lang sind (Monate haben 28 bis 31 Tage, Jahre haben 365 oder 366 Tage).

Hier könnte man analog zu dem im Artikel "Schaltjahr bestimmen" gezeigten schnellen Algorithmus vorgehen. Oder man verwendet ausnahmsweise doch DateAdd... smile!

© Jost Schwider, 20.02.2002-20.02.2002 - http://vb-tec.de/dateadd.htm