AspGerman Wiki

In der Praxis gibt es eine Vielzahl von Fragen rund um das Thema Zeit und Datum, so dass dieser Wiki Eintrag versucht im Schnellgang die Dinge zu wiederholen

Bearbeiten

Grundlegendes

Bearbeiten

Wo liegt das Problem bei Zeit und Datum?

Bearbeiten

Vordergründig

Sind es ein paar simple Dinge:

  1. .Da sind zum einen die Gegebenheiten des Datums – die Anzahl der Tage variiert pro Monat, Schaltjahre machen die Geschichte nicht einfacher. Bucklige Größen wie 24 Stunden oder 60 Minuten tragen ferner ihren Teil zur Komplexität bei.
  2. .Die Mensch – Maschine Kommunikation ist nicht einfach. Schreibt man nun die Zeit mit Punkt – was die meisten Menschen tun – oder mit Doppelpunkt – was die DIN-Norm fordert und die meisten Programme so erwarten? Durchaus gängig mittlerweile die 24-Stunden Uhr, wobei das bayrische "dreiviertel drei" eher noch selten verstanden wird. Wenig Diskussion gibt es beim Datum, das bei uns als Tag-Punkt-Monat-Punkt-Jahr geschrieben wird. Aber bereits in der Schweiz trennen sich die Geister, wo der Schrägstrich schon mal als Trennzeichen verwendet wird. In Übersee wird es dann noch mal deutlich anders.
  3. .Die Sache wird nicht dadurch einfacher, dass das System natürlich von diesen Schwierigkeiten "weiß" und versucht vieles automatisch zu erledigen. Der Blick für die grundlegenden Ding geht dabei verloren und, wie die viele Anfragen zur Zeit- und Datumsbehandlung zeigen, ist die Automatik nicht unfehlbar.

Was Zeit und Datum bedeutet, darüber sind wir uns weltweit einig: der Tag hat überall 24 Stunden und die Tage, Monate und Jahre sind – zumindest in der westlichen Welt – auch geregelt. Abweichend sind die Schreibweisen und das alleine ist der erste Fragengenerator.

Bearbeiten

Zusammenspiel

Der zweite große Fragenkomplex entsteht aus dem Zusammenspiel zweier Systeme: dem Programmiercode einer ASP Seite in VBScript (dieser Artikel beschränkt sich auf diese Sprache) und dem Zusammenspiel mit der Datenbank. Und damit meine ich primär Access (was von der Problematik her Formate wie dBase-, Paradox-, Text- und Exceldateien beinhaltet) und SQL Server. Sowohl als klassischer SQL Server als auch in der abgespeckten MSDE (Desktop Engine) Version.

Bearbeiten

Konstanten

Programmtechnisch ist dies die Grundlage, wird aber eher selten benötigt: eine Konstante oder auch Datumsliteral benannt.

#02/03/2004#
Oder in ein Scriptprogramm eingebunden

MeineVariable = #02/03/2004#
Response.Write "Ein beliebiges Datum ist der" 
Response.Write MeineVariable
Der gesamte Ausdruck wird vom Nummernkreuz eingeschlossen (kein Anführungszeichen), das Trennzeichen ist der Schrägstrich und die Reihenfolge ist US-amerikanisch: Monat - Tag - Jahr. Somit ist das Beispiel der dritte Februar 2004, nicht der zweite März wie bei deutscher Reihenfolge zu erwarten wäre.

Bearbeiten

Funktionen

Die sieht man schon häufiger: etwa die Funktionen welche die aktuellen Einstellungen des Servers liefern

date()  ' ergibt das aktuelle Datum (also ohne Zeit)
time()  ' ergibt die aktuelle Zeit (also ohne Datum)
now()   ' ergibt das aktuelle Datum zusammen mit der aktuelle Zeit
In ein Scriptprogramm eingebunden, beispielsweise so

MeineVariable = date()
Response.Write "Das heutige Datum ist der" 
Response.Write MeineVariable
Eine andere häufig verwendete Funktion ist CDate(), die einen String in ein Datum konvertiert

MeineVariable = CDate("2.3.2004")
Response.Write MeineVariable
Hier wird nun im Gegensatz zur Konstantendefinition die deutsche Schreibweise verwendet. Klassischer Einsatzzweck ist: der Benutzer gibt etwas ein und ich möchte es weiterverarbeiten. Eine eindeutige Einschränkung kommt hier ins Spiel: ohne weitere Vorkehrung müsste der Server - korrekterweise die Ländereinstellung des Default-Benutzers oder die des IUSR_rechnername Benutzers - auf deutscher Ländereinstellung stehen. Wurde beim Aufsetzen des Servers versäumt deutsche Ländereinstellungen als Standard anzugeben ist das nicht der Fall. Hier kann man sich behelfen indem ich ausdrücklich die Länderkennung angebe. Als Beispiel

SetLocale(1031)
MeineVariable = CDate("2.3.2004")
oder da sowohl der Ländercode als auch der Länderstring verwendet werden kann

SetLocale("de")
MeineVariable = CDate("2.3.2004")
Im Interesse der Erstellung von portablen Code wäre es sogar gut immer von falschen Servereinstellungen auszugehen und die Sprachfunktionen generell anzuwenden. 

Bearbeiten

Serielle Zahl

Hinter der Bühne wird bei Zeit und Datum eine serielle Zahl zur Speicherung verwendet. Das ist bei Access und VBScript zunächst gleich, bei SQL Server sehr ähnlich. Seriell bedeutet es wird die Anzahl der Tage seit einem festgelegtem Datum "gezählt". Wie macht man das sichtbar? Folgende Abfrage könnte man z.B. direkt in das SQL Fenster von Access eingeben

SELECT Int(Now()) AS datum FROM leereTabelle;
Wäre das aktuelle Datum der 1. Januar 2001, dann würde als Ergebnis 36892 erhalten. Dies stellt die Anzahl der Tage seit dem 1.1.1900 dar (nicht 100% akkurat, aber das ist eine andere Geschichte). Das gleiche Spiel in einer ASP Seite mit VBScript lässt sich

Response.write CDbl(date())
darstellen. 

Der Vorteil der seriellen Zahl liegt auf der Hand: ich kann wunderbar damit rechnen:

  1. .Eine Rechnung ist in 14 Tagen von heute fällig. Also das heutige Datum und 14 Tage draufaddieren. Die darunter liegende Software errechnet eine neue serielle Zahl die eingebauten Formatierungsfunktionen zeigen mir das Ergebnis in menschenlesbarer Form mit Tag, Monat und Jahr an. Ich brauche mich nicht mit Monatsgrenzen, Jahresgrenzen oder gar Schaltjahren zu plagen.
  2. .Wie viel Tage sind es noch bis zum nächsten Hochzeitstag? Auch hier ist die Rechnung einfach: Endedatum, also der Hochzeitstag minus aktuellem Datum gibt mir die Anzahl der Tage und wenn sie unter 2 rutscht wird es höchste Zeit dass der Computer Alarm schlägt.

Die serielle Zahl hat auch einen Nachkommateil: er dient dazu die Zeit als Bruchteil des Tages darzustellen. So wäre also 0,5 exakt die Mittagszeit, 0,25 dann 6:00 Uhr in der Früh oder 0,75 eben 18:00 abends. Auch dies kann man sich in Access anzeigen lassen. Die folgende Query würde etwa die aktuelle Tageszeit als Fließkommazahl anzeigen:

SELECT Sum(Now() - Int(Now())) AS zeit FROM leereTabelle;
In diesem Beispiel dient die Sum() Funktion nur dazu die Ausgabe in numerischer Form zu erzwingen. Lässt man die Summe weg, greift bereits die AutoMagic von Access wieder und zeigt nicht die zugrunde liegende Zahl sondern schön formatiert die Uhrzeit an. 

Daraus folgt

  1. .Zeit und Datum lassen sich wunderbar kombinieren. Streng genommen sind sie eh immer kombiniert, auch wenn sie vielleicht nur als ausschließliche Zeit- oder Datumsfelder (oder Variablen in Scriptsprachen) verwendet werden.
  2. .Die Einheit der seriellen Zahl ist der Tag. So simpel dieser Satz klingen mag, so wichtig wird er in der Anwendung!



ScrewTurn Wiki version 2.0.33. Some of the icons created by FamFamFam.