Sonstiges: Datum und Zeit im '30. Dezember 1899 0 Uhr'-Format

Zugegeben - dieser Artikel hat einen seltsamen Titel. Aber das Format, von dem hier die Rede ist, wird an so vielen unterschiedlichen Stellen auf Windows-PCs verwendet, dass es schwierig ist, einen passenden allgemein gültigen Titel zu finden.

Hier eine - wahrscheinlich nicht vollständige - Liste von alternativen Bezeichnungen

  • Microsoft Excel Datums- und Zeitformat
  • Microsoft Access Datums- und Zeitformat
  • Visual Basic Datums- und Zeitformat
  • Visual Basic for Applications (VBA) Datums- und Zeitformat
  • Visual Basic Script (VBS) Datums- und Zeitformat
  • Variant Datums- und Zeitformat
  • ActiveX Datums- und Zeitformat

Das bedeutet: Egal, wo Sie mit einem Datumswert, Zeitwert oder kombinierten Datums- und Zeitwert arbeiten, das interne Format ist immer identisch. Damit ist es austauschbar und - wenn man das Format einmal verstanden hat - sehr leicht zu verwenden.


Vielleicht auch interessant für Sie: PC-Tischrechner

Hier geht's zum Video mit der Kurzdemonstration zum PC-Tischrechner

Zunächst die grundlegenden Informationen

Jede Datums- und/oder Zeitangabe wird als Fliesskommazahl zwischen -657434 und 2958465.99999 verarbeitet. Dazu einige Beispiele:

Fliesskommawert Datum Uhrzeit
-657434 01.01.0100 00:00:00
0 30.12.1899 00:00:00
0,75 30.12.1899 18:00:00
2958465,99999 31.12.9999 23:59:59

Dieses Format sieht auf den ersten Blick möglicherweise sehr verwirrend aus. Wer kann sich schon merken, dass der 1. Januar 2000 12 Uhr Mittag irgendwo intern als der Fliesskommawert '36526.5' verarbeitet wird. Aber das ist auch nicht unbedingt erforderlich.

Die Vorteile dieses Formates

Mit Hilfe dieses Formates wird es 'extrem' einfach mit Datumsangaben und Zeitangaben zu rechnen. Beispiele:

Berechnung Interne Darstellung Formatierte Ausgabe
1. Januar 2000 + 49 Tage 36526 + 49 = 36575 19.02.2000
Differenz aus 12:31 und 13:54 0,579167 - 0,5215278 = 0,0576392 01:23
06:28 + 2h 13Min 0,26944 + (1 / 24 * 2) + ((1 / (24 * 60) * 13) = 0,3618011 08:41
08:20 * 30 Euro/Std 0,34722 * 30 * 24 = 249,9984 250,00 Euro
--- (1 / 24) = 0,041667 01:00:00 (eine Stunde)
--- (1 / (24 * 60)) = 0,0006944 00:01:00 (eine Minute)

Die Fliesskommazahlen in diesem Beispiel mögen unübersichtlich wirken. Der entscheidende Punkt ist, dass man auf Datums- und Zeitangaben normale arithmetische Operationen anwenden kann.

Interne Verarbeitung vs. Darstellung

Hier muss die Sichtweise berücksichtigt werden

Sicht eines Benutzers z.B. von Excel

In den meisten Fällen erledigt Excel (oder auch Access) alles Notwendige im Hintergrund.

Wenn jemand einen beliebigen Wert, der als Datums- oder Zeitangabe interpretiert werden kann, eingibt, übernimmt Excel diesen Wert intern in das hier beschriebene Format und gibt den Inhalt passend formatiert aus . Siehe nachstehendes Beispiel:

Dieser Automatismus hat jedoch Tücken:

  • Manchmal möchte man z.B. 1.1.6 als Text eingeben. Aber Excel macht daraus den 01.01.2006. Um das zu verhindern können Sie ="1.1.6" in die Zelle eintippen. Das ist für Excel die Anweisung, was in Klammern steht als Text auszugeben.
  • Wenn Sie - z.B. für eine Zeitabrechnung - Stunden und Minuten summieren möchten, rechnet Excel scheinbar falsch, wenn die Summe der Stunden den Wert 24 überschreitet. Das sieht aber nur so aus. Wenn die Summe der Stunden und Minuten z.B. 36:30 ist, arbeitet Excel intern mit dem Wert 1,52 und stellt diesen Wert standardmässig als 12:30 dar (1 Tag/24 Stunden wird/werden abgeschnitten). Legen Sie das Zahlenformat für die betreffende Zelle wie folgt fest und die Anzeige ist wie erwartet.
  • Überhaupt: Wenn Sie 'irgendwie seltsame' Werte in irgendwelchen Zellen angezeigt bekommen, liegt das fast immer daran, dass die betreffende Zelle ein unpassendes Zahlenformat hat.

Trotz dieser Tücken ist es in den meisten Fällen keine gute Idee, wenn man versucht, die normale Verarbeitung von Datums-/Zeitwerten in Excel zu unterbinden. Zum einen verhindern Sie damit unter Umständen dass mit den Werten gerechnet werden kann (wie oben beschrieben). Darüber hinaus hat dieses Format noch einen weiteren Vorteil: Wenn Sie Ihre Berechnung z.B. an einen englischsprachigen Kollegen weitergeben und dieser die Berechnung an seinem PC öffnet, wird er alle Werte in der in seinem Kulturkreis üblichen Schreibweise sehen und damit richtig verstehen. Beispiel: Im angelsächsichen Sprachraum werden Datumsangaben oft in der Form Monat, Tag, Jahr (April, 1, 2007) geschrieben.

Sicht eines Programmierers

Anmerkung: Auch wenn das hier Geschriebene in erster Linie auf VB/VBA/VBS ausgerichtet ist, so kann - zumindest in Windows-Umgebungen - auch mit C++ entsprechend programmiert werden. Allerdings ist das nicht so wunderbar einfach wie mit VB.

VB-Programmierer benötigen nur einige wenige der VB-Konvertierungs-Anweisungen, um leicht und elegant das hier beschriebene Format zu verwenden.

  • Format()
  • CDate()
  • CDbl()
  • CLng()

Darüber hinaus können in manchen Situationen folgende VB-Konvertierungs-Anweisungen hilfreich sein:

  • DateSerial()
  • TimeSerial()
  • Now()

Folgende Beispiele sollten alles Notwendige für die tägliche Programmierpraxis zeigen.

Anweisung Ausgabe Anmerkung
Now() Z.B.: 18.02.2007 14:29:43 Momentanes Datum und Uhrzeit im Standardformat des Betriebssystems
Format(Now(), "hh:MM:ss") Z.B.: 14:33:58 Momentane Uhrzeit in definiertem Format
Format(Now(), "dd.mm.yyyy") Z.B.: 18.02.2007 Momentanes Datum in definiertem Format
CDbl(CDate("08:20")) Z.B.: 0,347222222222222 Die Uhrzeit 08:20 als Bruchteil eines ganzen Tages
CLng(CDate("01.01.2000")) 36526 Die Anzahl der Tage seit dem '0-Tag', dem 30.12.1899
CDbl(CDate("01.01.2000 08:20")) 36526,3472222222 Die Anzahl der Tage seit dem '0-Tag', dem 30.12.1899 plus die Uhrzeit 08:20 als Bruchteil eines ganzen Tages
Format(36526.3472222222, "dd.mm.yyyy hh:MM") 01.01.2000 08:20 Datums- und Zeitwert der angegebenen Zahl im angegebenen Format.
Format(36526.3472222222, "dd.mm.yyyy") 01.01.2000 Datumswert der angegebenen Zahl im angegebenen Format. Zeitanteil unberücksichtigt.
Format(36526.3472222222, "hh:MM") 08:20 Zeitwert der angegebenen Zahl im angegebenen Format. Datumanteil unberrücksichtigt.
Format(0.75, "hh:MM") 18:00 Zeitwert der angegebenen Zahl im angegeben Format.
Format(DateSerial(2006, 13, 32), "dd.mm.yyyy") 01.02.2007 Formatierte Ausgabe des Datums 32.13.2006. Bitte beachten, Sie wie elegant DateSerial() diesen scheinbar unsinnigen Aufruf verarbeitet und daraus ein sinnvolles Datum macht. Selbstverständlich arbeitet DateSerial() auch mit 'normalen' Angaben für Tag, Monat und Jahr.
CDbl(TimeSerial(18, 30, 02)) 0,770856481481481 Zeitwert von 18:30:02.
TimeSerial(18, 70, 02) 19:10:02 Auch TimeSerial() kommt problemlos mit scheinbar unsinnigen Parametern zurecht. Wird die Format() Anweisung weggelassen wird (wie auch bei DateSerial()) das Standardformat des Betriebssystems verwendet.

Seitenanfang

Kontaktaufnahme- und Terminvereinbarung:

Bei Fragen und für Terminvereinbarungen erreichen Sie uns unter:

0 63 49 99 07 38

0 151 51 95 34 00

Oder nutzen Sie das Kontaktformular




Ihr Ansprechpartner:


Hier sollte das Fahnungsfoto zu sehen sein.

Ralf Kunsmann

Spezialist für VBA-Programmierung
(alle Office-Anwendungen)
Entwickler der
VBA-Extension-Tools