## 14.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 definitives 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 mySpan = new TimeSpan(3, 12, 15);
    now = now.Add(mySpan);
    Console.WriteLine(now);
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 mySpan. 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 mittels 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 Beispiel 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 14\Zeitdifferenz
    // ---------------------------------------------------------
    class Program {
      static void Main(string[] args) {
        // aktuelle Systemzeit festlegen
        DateTime actDate = DateTime.Now;
        // das zu vergleichende Datum entgegennehmen
        Console.Write("Geben Sie das Vergleichsdatum ");
        Console.Write("im Format tt.mm.jjjj ein:  ");
        string strDate = Convert.ToString(Console.ReadLine());
        // 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);
      }
    }
Das Eingabeformat ist vorgeschrieben, da es nach der Bestätigung durch den Aufruf der Methode in ein Format überführt wird, das einem DateTime-Typ entspricht. 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 myTimeSpan = new TimeSpan(2, 12, 30, 22, 100);
    Console.WriteLine(myTimeSpan.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.
    // Die Anweisung beschreibt eine Zeitspanne von 3 Stunden.
    TimeSpan ts = TimeSpan.FromHours(3);