Datumsfunktionen

Wenn Sie ein Abonnement des Magazins 'DATENBANKENTWICKLER' besitzen, können Sie sich anmelden und den kompletten Artikel lesen.
Anderenfalls können Sie das Abonnement hier im Shop erwerben.

Datumsfunktionen

Ohne Datumsfunktionen kommt man in keiner Programmiersprache aus. Das ist unter C# natürlich nicht anders. Wer allerdings von Access/VBA kommt, muss sich ein wenig umstellen: Einzelne Funktionen wie Date() oder Time(), mit denen Sie beispielsweise das aktuelle Datum oder die aktuelle Uhrzeit ermittelt haben, suchen Sie hier vergeblich. Stattdessen nutzen Sie verschiedene Eigenschaften des Objekts DateTime. Der vorliegende Artikel zeigt die wichtigsten Elemente der C#-Programmiersprache zum Thema Datum und erläutert, wie das Datum hier im Hintergrund behandelt wird.

Aktuelles Datum und aktuelle Uhrzeit ausgeben

Als erstes Beispiel wollen wir das aktuelle Datum und die aktuelle Uhrzeit in zwei Textfeldern eines WPF-Fensters ausgeben. Die Steuerelemente dafür definieren wir wie folgt:

<Grid>
     <Grid.RowDefinitions>
         <RowDefinition Height="Auto"></RowDefinition>
         <RowDefinition Height="Auto"></RowDefinition>
     </Grid.RowDefinitions>
     <Grid.ColumnDefinitions>
         <ColumnDefinition Width="Auto"></ColumnDefinition>
         <ColumnDefinition Width="Auto"></ColumnDefinition>
         <ColumnDefinition Width="*"></ColumnDefinition>
     </Grid.ColumnDefinitions>
     <Label Content="Aktuelles Datum (DateTime.Now.ToShortDateString):"></Label>
     <TextBox x:Name="txtAktuellesDatum" Grid.Column="1"></TextBox>
     <Button x:Name="btnAktuellesDatum" Content="Aktualisieren" Grid.Column="2" Click="btnAktuellesDatum_Click"></Button>
     <Label Content="Aktuelle Zeit (DateTime.Now.ToShortTimeString):" Grid.Row="1"></Label>
     <TextBox x:Name="txtAktuelleZeit" Grid.Row="1" Grid.Column="1"></TextBox>
     <Button x:Name="btnAktuelleZeit" Content="Aktualisieren" Grid.Row="1" Grid.Column="2" Click="btnAktuelleZeit_Click"></Button>
</Grid>

Dies ist das Grundgerüst, weitere Elemente rüsten wir im Laufe dieses Artikels nach. In diesem Fall haben wir ein Grid aufgebaut, dass drei Spalten enthält – eines mit der Bezeichnung, eines mit dem per C# ermittelten Inhalt und eines mit einer Schaltfläche, um den Inhalt des Textfeldes zu aktualisieren oder andere Funktionen auszuführen.

Das obere Textfeld soll das aktuelle Datum anzeigen, das untere die aktuelle Uhrzeit. Die Beschriftungen verraten bereits die dort verwendeten C#-Funktionen. In der Konstruktormethode MainWindow() füllen wir die Textfelder gleich beim Anzeigen des Fensters:

public MainWindow() {
     InitializeComponent();
     txtAktuellesDatum.Text = DateTime.Now.ToShortDateString();
     txtAktuelleZeit.Text = DateTime.Now.ToLongTimeString();
}

Hier sehen Sie, dass wir das aktuelle Datum mit dem Ausdruck DateTime.Now.ToShortDateString() ermitteln. Dabei ist DateTime das zentrale Objekt, wenn es sich um Datum- und Zeitangaben dreht. Nach diesem einführenden Beispiel schauen wir uns an, was die DateTime-Klasse alles bietet. Das Ergebnis sieht wie in Bild 1 aus.

Ausgabe in Textfeldern

Bild 1: Ausgabe in Textfeldern

Die DateTime-Klasse

Während wir unter VBA einfach Funktionen wie Date() oder Time() nutzen konnten, um die aktuelle Uhrzeit zu ermitteln, benötigen wir unter C# natürlich die Methoden eines Objekts für diesen Zweck – beziehungsweise die statischen Methoden einer Klasse. In diesem Fall nutzen wir die Methode Now der Klasse DateTime, um auf das aktuelle Datum und die aktuelle Uhrzeit zuzugreifen, also DateTime.Now. Allerdings reicht dies noch nicht aus, denn wir benötigen noch ein Ausgabeformat. DateTime.Now liefert nämlich eine Struktur des Typs DateTime zurück, deren Inhalt so nicht direkt ausgegeben werden kann.

Dazu nutzen wir dann wie im obigen Beispiel etwa die Methoden ToShortDateString() oder ToLongTimeString().

Datentyp für das Datum und Ticks

Der Datentyp zum Speichern von Datumswerten heißt unter C# DateTime. Genaugenommen handelt es sich um eine Struktur, mit der Sie Zeitangaben vom 1.1.0001 bis zum 31.12.9999 darstellen können. Intern wird das Datum als long-Wert in der Einheit Tick gespeichert. Ein Tick entspricht hundert Nanosekunden – das sollte für die meisten Anwendungsfälle ausreichend genau sein. Damit steht die interne Speicherung im Gegensatz zu der etwa unter VBA: Hier wird ein Datum als Fließkommazahl gespeichert, wobei der Teil vor dem Komma dem Datum und der Teil nach dem Komma der Uhrzeit entspricht.

Neben den Ticks als long-Wert enthält DateTime auch noch die Kind-Eigenschaft, welche speichert, ob es sich um ein lokales Datum, ein UTC-Datum (mehr dazu weiter unten) oder ein unspezifisches Datum handelt.

Die verschiedenen Darstellungen wie etwa langes Datum, kurzes Datum, lange Uhrzeit, kurze Uhrzeit oder auch Kombinationen sind lediglich Umrechnungen der gespeicherten Anzahl Ticks in einen Datumswert und die Ausgabe als String.

Statische Funktionen der DateTime-Klasse

Die DateTime-Klasse liefert eine Reihe Funktionen rund um Datumsangaben, die Sie kennen sollten:

Compare: Erwartet zwei DateTime-Objekte und gibt folgende Werte zurück: -1, wenn das erste Datum kleiner als das zweite Datum ist, 0, wenn beide Daten genau gleich sind und 1, wenn das zweite Datum kleiner als das erste Datum ist.

DaysInMonth: Erwartet die Angabe von Jahr und Monat als Parameter und liefert die Anzahl der Tage dieses Monats zurück. Beispiel: DaysInMonth(2017, 1) liefert 31.

Equals: Gibt für die beiden als Parameter übergebenen DateTime-Objekte an, ob diese gleich sind. Beispiel: DateTime.Equals(new DateTime(2017, 1, 1), new DateTime(2017, 1, 1)).ToString() liefert true.

FromBinary: Liest ein Datum von einer binären Repräsentation eines Datums im long-Format wieder in ein Datum ein. Dazu benötigen Sie zunächst die binäre Form, welche wir im Vorgriff auf die Methoden von Objekten auf Basis der Klasse DateTime mit der Methode ToBinary erstellen. Wir erstellen hier ein Datum mit Now und speichern seine mit ToBinary() erstellte binäre Repräsentation in der Variablen lngDat. Dann geben wir das Originaldatum, die binäre Variante und das aus dieser Variante zurückverwandelte DateTime-Objekt aus:

DateTime dat = DateTime.Now;
long lngDat = dat.ToBinary();
Console.WriteLine("Orig. Datum: {0}", dat.ToString());
Console.WriteLine("Datum binär: {0}", lngDat.ToString());
Console.WriteLine("FromBinary:  {0}", DateTime.FromBinary(lngDat).ToString());

FromFileTime: Wie FromBinary, allerdings wird hier eine mit der Methode ToFileTime erstellte Anzahl von Ticks wieder zurückverwandelt.

FromFileTimeUTC: Wie FromFileTime, nur dass die mit der Methode ToFileTimeUTC erstellte Anzahl von Ticks für eine UTC-Zeit wieder zurückverwandelt wird.

FromOADate: Wandelt ein Datum, dass unter VBA/OLE erstellt wurde (also die Repräsentation durch eine Fließkommazahl, deren Vorkommastellen das Datum und deren Dezimalstellen die Uhrzeit markieren), in ein DateTime-Objekt um.

IsLeapYear: Gibt an, ob es sich bei dem als Parameter übergebenen Jahr um ein Schaltjahr handelt. Beispiel: DateTime.IsLeapYear(2016).ToString() liefert true.

MaxValue: Liefert den größtmöglichen Wert eines DateTime-Objekts. Beispiel: DateTime.MaxValue().ToString() liefert 31.12.9999 23:59:59.

MinValue: Liefert den kleinstmöglichen Wert eines DateTime-Objekts. Beispiel: DateTime.MinValue().ToString() liefert 01.01.0001 00:00:00.

Now: Liefert ein DateTime-Objekt mit dem aktuellen Datum und der aktuellen Uhrzeit. Das DateTime-Objekt offeriert weitere Methoden (siehe unten).

Parse: Erwartet eine Zeichenkette mit einem Datum, welches dann in ein DateTime-Objekt konvertiert wird, zum Beispiel DateTime.Parse("1.2.2017 10:11:12").ToString().

ParseExact: Wie Parse, nur dass hier noch das genaue Format vorgegeben werden muss: DateTime.ParseExact("01.02.2017 10:11:12", "dd.MM.yyyy hh:mm:ss", null).ToString();

ReferenceEquals: Vergleicht zwei Instanzen und gibt an, ob diese gleich sind. Beispiel: DateTime.ReferenceEquals(new DateTime(2017,1,1), new DateTime(2017,1,1)).ToString() liefert false, da es sich ja um zwei unabhängig erstellte Instanzen handelt.

SpecifyKind: Art des DateTime-Objekts festlegen. Der erste Parameter nimmt das DateTime-Objekt entgegen, wobei es sich um ein bestehendes oder auch um ein neu erstelltes DateTime-Objekt handeln kann. Der zweite Parameter erwartet ein Element der Enumeration DateTimeKind, also etwa UTC, Local oder Unspecified.

Today: Liefert ein DateTime-Objekt mit dem aktuellen Datum. Beispiel: DateTime.Today.ToString()

TryParse: Erwartet eine Zeichenkette mit einem Datum, welches in ein DateTime-Objekt konvertiert wird, das mit dem zweiten Parameter zurückgegeben wird. Die Funktion liefert den Wert true zurück, wenn die Zeichenkette geparst werden konnte, sonst false.

TryParseExact: Wie TryParse/ParseExact.

UTCNow: Liefert ein DateTime-Objekt, welches das aktuelle Datum und die Uhrzeit für die koordinierte Weltzeit enthält, also für die Zeitzone, in der sich Greenwich/London befindet.

Zur koordinierten Weltzeit

Die von der Funktion UTCNow gelieferte koordinierte Weltzeit liefert die aktuelle Uhrzeit plus Datum aus Greenwich (früher GMT/Greenwich Mean Time, jetzt UCT/Universal Coordinated Time). Wozu benötigt man diese Zeit, die sich zum Beispiel während der Sommerzeit um zwei Stunden von der Zeit in Deutschland unterscheidet? Wenn Sie eine Datenbank nutzen, die von Benutzern in verschiedenen Zeitzonen verwendet wird, dann sollten Sie Datumsangaben in der Datenbank in dieser Zeit speichern.

Alternativ müssen Sie die Zeitzone in einem separaten Feld speichern, damit Sie später beispielsweise nachvollziehen können, in welcher Reihenfolge Bestellungen eingegangen sind. Sonst würde eine Bestellung, die um 12:00 Uhr lokaler Zeit in Deutschland eingegangen ist gegenüber einer Bestellung, die um 9:00 Uhr lokaler Zeit an der amerikanischen Ostküste eingegangen ist, in der falschen Reihenfolge gespeichert werden – vorausgesetzt, die Zeitzone wurde nicht mitgespeichert. Wenn Sie die Zeiten in UTC-Zeit umwandeln, würde 12:00 Uhr deutscher Zeit 10:00 Uhr UTC entsprechen und 9:00 Uhr lokaler Zeit an der amerikanischen Ostküste wäre 13:00 Uhr UTC.

DateTime-Objekte per Konstruktor erstellen

Neben den Methoden wie Now, Today oder UTCNow, die automatisch das aktuelle Datum beziehungsweise die aktuelle Uhrzeit ermitteln, und Methoden wie Parse oder TryParse, denen Sie einen Datumsstring übergeben, der in ein DateTime-Objekt umgewandelt werden soll, gibt es noch verschiedene Konstruktor-Methoden der DateTime-Klasse. Das heißt, dass Sie die dem Datum und/oder der Uhrzeit zugrundeliegenden Informationen beim Initialisieren als Parameter übergeben.

Dies war die Leseprobe dieses Artikels.
Melden Sie sich an, um auf den vollständigen Artikel zuzugreifen.

Bitte geben Sie die Zahlenfolge in das nachfolgende Textfeld ein

Die mit einem * markierten Felder sind Pflichtfelder.

Aktuell im Blog
Onlinebanking mit Access

Es ist geschafft: Endlich ist das Buch Onlinebanking mit Access fertiggeschrieben. Das war... [mehr]

Direktzugriff auf Tabellen und Felder

Die IntelliSense-Erweiterung für Tabellen und Felder hat mir soviel Spaß gemacht, dass ich gleich... [mehr]

IntelliSense für Tabellen und Felder

Wenn Sie mit dem VBA-Editor arbeiten und dort gelegentlich SQL-Anweisungen eingeben, müssen Sie... [mehr]

Download Access und SQL Server

Erfahren Sie, welche Schritte zum Download des aktuellen Stands des Buchs "Access und SQL Server"... [mehr]

Bilder in Access 2013

Wer die Bibliothek mdlOGL0710 von Sascha Trowitzsch oder ein ähnliches Modul aus meinen... [mehr]

Dynamische Ribbons

Immer wieder fragen Leser, wie man Ribbon-Elemente wie etwa Schaltflächen in Abhängigkeit... [mehr]

Die Blogmaschine

Einen kleinen Blog zusätzlich zum Shop zu betreiben ist eine tolle Sache. Hier lassen sich... [mehr]

Wegwerfadressen für die Newsletteranmeldung

Die Verwendung von Wegwerf-Adressen für die Nutzung aller möglichen Online-Dienste nimmt... [mehr]

Access und Facebook

Facebook und Access - das ist eine der wenigen Kombinationen, die ich noch nicht in die Mangel... [mehr]

Access und SQL Server - das Projekt

Mein neues Buch Access und SQL Server (gemeinsam mit Bernd Jungbluth) geht in die Endphase. Wer... [mehr]