Lies in den Artikel rein und unten bekommst Du ein unschlagbares Angebot!
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, das 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.
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. Genau genommen 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ück verwandelt.
FromFileTimeUTC: Wie FromFileTime, nur dass die mit der Methode ToFileTimeUTC erstellte Anzahl von Ticks für eine UTC-Zeit wieder zurück verwandelt wird.
FromOADate: Wandelt ein Datum, das 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.