Heute und jetzt Datum und Zeit umwandeln

Object Pascal im Detail - Besondere Datentypen www.delphi-treff.de 129

4.12. Besondere Datentypen

In einem vorigen Kapitel haben wir die grundlegenden Datentypen in Delphi kennengelernt. Nun gibt es noch weitere Datentypen, die etwas komplexer sind und zum Teil in Form von Klassen zur Verfügung stehen. Aus diesem Grund kommt dieses Kapitel erst hier, nachdem wir die Objektorientierung kennengelernt haben. Konkret geht es z.B. um Listen, die einfacher zu handhaben sein können als simple Arrays, und um Datums- und Zeit-Werte.

4.12.1. Datum und Zeit

Will man mit Datumswerten rechnen, z.B. Tage hinzuzählen oder abziehen, ist es ungünstig, das Datum in einer String-Variablen abgelegt zu haben. Auch jeweils eine Integer-Variable für Tag, Monat und Jahr anzulegen, ist i ht i kli h s hö . u al da i e die Bedi gu ge dazu kä e ie „We Tag g öße als , da setze Tag auf 1 und zähle den Monat um eins hoch. Wenn es sich um April, Juni, September oder November handelt, dann darf der Tag hö hste s sei . U d as ist it “ haltjah e i Fe ua ? Natü li h u de all das s ho mal von jemandem programmiert. Und wenn wir das verwenden wollen, setzen wir in Delphi auf die Datentypen TDate, TTime und TDateTime. TDate beinhaltet lediglich ein Datum ohne Uhrzeit, TTime nur eine Uhrzeit und TDateTime beides. Alle drei Typen können ohne das Einbinden spezieller Units verwendet werden. Die Units SysUtils und DateUtils bieten jede Menge Funktionen, um mit Datums- und Zeitwerten zu arbeiten. Genau genommen ist TDateTime einfach ein Double-Wert, also eine Zahl. Der ganzzahlige Anteil stellt dabei die Tage seit dem 30.12.1899 dar, der Nachkommateil bestimmt die Uhrzeit als Bruchteil eines Tages.

4.12.1.1. Heute und jetzt

Zunächst sehen wir uns an einem Beispiel an, wie man TDate-, TTime- und TDateTime-Variablen auf das aktuelle Datum bzw. die aktuelle Zeit setzt: uses SysUtils; var datum: TDate; zeit: TTime; datumZeit: TDateTime; begin datum := Date; datum enthält nun das aktuelle Systemdatum zeit := Time; zeit enthält nun die aktuelle Systemuhrzeit datumZeit := Now; datumZeit enthält sowohl Datum als auch Uhrzeit „Date , „Ti e u d „No sind Funktionen der Unit SysUtils.

4.12.1.2. Datum und Zeit umwandeln

Häufig bekommt man ein Datum aber über eine Benutzereingabe als String und muss diesen in einen Datumswert umwandeln: Object Pascal im Detail - Besondere Datentypen www.delphi-treff.de 130 uses SysUtils; var datum: TDate; begin datum := StrToDateEdit1.Text; Genauso gibt es auch StrToTime usw. sowie die umgekehrte Richtung DateToStr, TimeToStr , … fü den Fall, dass ein Datumswert in der GUI dargestellt werden soll. Ein Problem beim Umwandeln eines Strings in ein Datum kann natürlich sein, dass der Benutzer einen String eingegeben hat, der sich gar nicht in ein gültiges Datum konvertieren lässt. In diesem Fall fliegt eine Exception vom Typ EConvertError. Möchte man auf das Abfangen dieses Fehlers verzichten, bietet sich auch die Funktion TryStrToDate an: uses SysUtils; var datum: TDate; begin if TryStrToDateEdit1.Text, datum then ... TryStrToDate erwartet zwei Parameter: als erstes den umzuwandelnden String und als zweites die TDate- Variable, in der das umgewandelte Datum abgelegt werden soll. Falls die Umwandlung nicht funktioniert, gibt die Funktion false zurück, so dass der Teil nach dem then in obigem Beispiel nicht ausgeführt werden würde. Als dritte Variante zur Erzeugung eines Datums- oder Zeitwertes gibt es die Encode-Funktionen, denen man ein Datum oder eine Uhrzeit in ihren Einzelteilen mitgibt: uses SysUtils; var datum: TDate; begin datum := EncodeDate2011, 12, 24; Und schließlich gibt es für VCL-Anwendungen auch die Komponente TDateTimePicker. Damit hat der Anwender die Möglichkeit, ein Datum in einem grafischen Kalender auszuwählen. In der Anwendung kann man sich dann sicher sein, dass das Datum korrekt ist. Falscheingaben sind nicht möglich. Nun können wir mit den Datums- und Zeitwerten arbeiten. Hier ein paar Beispiele, die in den allermeisten Fällen das Einbinden der Unit DateUtils voraussetzen: Object Pascal im Detail - Besondere Datentypen www.delphi-treff.de 131

4.12.1.3. Ermittlung des Wochentags eines Datums