16.5 Die Klasse »TimeSpan«
Aus den Methoden zur Manipulation einer DateTime-Instanz ragt eine heraus, deren Parametertyp sich von denen der anderen, gleichartigen Methoden unterscheidet. Es ist die Methode Add, deren Definition wir uns anschauen wollen:
public DateTime Add(TimeSpan);
Dem Parameter wird ein Objekt vom Typ TimeSpan übergeben. Dieser Typ scheint nur auf den ersten Blick dem Typ DateTime zu ähneln, aber beide unterscheiden sich grundlegend: Mit DateTime wird ein Datum beschrieben, mit TimeSpan eine Zeitspanne. Dies machen auch die Konstruktoren der TimeSpan-Klasse deutlich, die Tage, Stunden, Minuten usw. entgegennehmen.
Der folgende Beispielcode zeigt, wie eine Referenz auf eine TimeSpan-Instanz an die Methode Add übergeben wird:
DateTime now = new DateTime(2002, 2, 3, 12, 0, 0);
TimeSpan span = new TimeSpan(3, 12, 15);
now = now.Add(span);
Console.WriteLine(now);
Listing 16.28 Zeitspanne für Rechenoperation mit »DateTime« angeben
In der ersten Codezeile wird die Klasse DateTime instanziiert und dem Konstruktor das Datum 3. Februar 2002, 12:00 Uhr übergeben. In der folgenden Anweisung erzeugen wir das TimeSpan-Objekt span. Der Konstruktor mit drei Parametern übernimmt als Argumente Stunden, Minuten und Sekunden – er beschreibt demnach eine Zeitspanne von drei Stunden, zwölf Minuten, 15 Sekunden. Der Add-Methode wird danach das TimeSpan-Objekt übergeben, mit dem Datum und Zeit neu bestimmt werden.
Eine Reihe vordefinierter Konstanten erleichtert die Umrechnung von Zeiteinheiten in Ticks, wenn unterschiedliche Zeitangaben mit Hilfe eines Faktors auf eine gemeinsame Einheitsbasis gebracht werden müssen – diese Basis bilden bekanntlich die Ticks. So beschreibt die Konstante TicksPerDay beispielsweise die Anzahl der Ticks pro Tag, und TicksPerHour gibt die Ticks pro Stunde an.
Das folgende Beispielprogramm zeigt, wie diese Konstanten sinnvoll eingesetzt werden können. Die benutzerdefinierten Funktionen DiffHours und DiffSeconds nehmen jeweils eine Referenz vom Typ DateTime entgegen und berechnen den Unterschied zwischen zwei Datumswerten in Stunden bzw. Sekunden. Dabei ist der erste Datumswert das aktuelle Systemdatum, das wie üblich über Now ermittelt wird, und den zweiten Datumswert muss der Anwender an der Konsole eingeben.
// Beispiel: ..\Kapitel 16\Zeitdifferenz
class Program {
static void Main(string[] args) {
// aktuelle Systemzeit ermitteln
DateTime actDate = DateTime.Now;
// das zu vergleichende Datum eingeben
Console.Write("Geben Sie das Vergleichsdatum ");
Console.Write("im Format tt.mm.jjjj ein: ");
string strDate = Convert.ToString(Console.ReadLine());
// die Eingabe passend formatieren
strDate = strDate.Replace('.', '/');
DateTime newDate = Convert.ToDateTime(strDate);
// Ausgabe der Differenz in Stunden
Console.Write("Die Differenz in Stunden: ");
Console.WriteLine(DiffHours(actDate, newDate));
// Ausgabe der Differenz in Sekunden
Console.Write("Die Differenz in Sekunden: ");
Console.WriteLine(DiffSeconds(actDate, newDate));
Console.ReadLine();
}
public static long DiffHours(DateTime d1,DateTime d2) {
long x = d2.Ticks - d1.Ticks;
return Convert.ToInt64(x / TimeSpan.TicksPerHour);
}
public static long DiffSeconds(DateTime d1,DateTime d2) {
long x = d2.Ticks - d1.Ticks;
return Convert.ToInt64(x / TimeSpan.TicksPerSecond);
}
}
Listing 16.29 Das Beispielprogramm »Zeitdifferenz«
Der Algorithmus des Programmcodes in den beiden Methoden DiffHours und DiffSeconds ist ähnlich. Beide Routinen nehmen in ihren Parametern Referenzen des Typs DateTime entgegen und rechnen das jeweilige Datum mit der Eigenschaft Ticks zunächst in die Basiseinheit um, um im Anschluss daran die Differenz zu bilden. Die abschließende Division durch TicksPerHour bzw. TicksPerSecond liefert einen long, der dem Aufrufer zurückgegeben wird.
Weitere Möglichkeiten der Klasse »TimeSpan«
Eine TimeSpan-Instanz beschreibt eine Zeitspanne aus Tagen, Stunden, Minuten, Sekunden und Millisekunden. Diese Zeitspanne lässt sich in einem String abbilden, der dem folgenden Format entspricht:
Tag.Stunden:Minuten:Sekunden.Sekundenbruchteil
Dazu ein Beispiel. Mit
TimeSpan span = new TimeSpan(2, 12, 30, 22, 100);
Console.WriteLine(span.ToString());
erhalten Sie die folgende Ausgabe:
2.12:30:22.1000000
Manchmal ist es notwendig, die Angabe einer Zeitspanne in eine konkrete Zeiteinheit umzurechnen oder aus der Angabe einer Zahl, die eine Zeiteinheit widerspiegelt, ein TimeSpan-Objekt zu erzeugen. Auch dazu liefert die Klasse TimeSpan die passenden Methoden. Nehmen wir an, Sie wollten das mit
TimeSpan span = new TimeSpan(1, 35, 45);
erzeugte Objekt, das einen Tag, 35 Minuten und 45 Sekunden beschreibt, in eine Zahl umwandeln. Es stellt sich mit den Möglichkeiten der Klasse nur noch die Frage, ob Sie eine Ganzzahl oder eine Dezimalzahl benötigen. Für beide Fälle gibt es die passenden Eigenschaften. Beispielsweise liefert:
- die Hours-Eigenschaft einen int und
- die TotalHours-Eigenschaft einen double.
Die Anweisung
Console.WriteLine(span.TotalHours);
wird das Ergebnis 1,5958333333333 haben. Beim Aufruf von Hours wird der Dezimalteil abgeschnitten. Analog lautende Eigenschaften gibt es auch, um mit Tagen, Minuten oder Sekunden zu operieren.
Einige statische Methoden des Typs TimeSpan ermöglichen es auch ohne Initialisierung, einer TimeSpan-Variablen einen Wert zuzuweisen. Diese Methoden beginnen mit dem Präfix From, beispielsweise FromSeconds, FromMinutes, FromDays.
// Zeitspanne von 3 Stunden
TimeSpan ts = TimeSpan.FromHours(3);
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.