10.5 Zeitmessung
Um ein Datum einschließlich einer Zeitangabe in einer Variablen zu speichern, deklarieren Sie die Variable vom Typ DateTime, beispielsweise:
Dim datum As New DateTime(2003, 12, 6) Console.WriteLine(datum) 'Ausgabe: 06.12.2003 00:00:00
Mit einer Variablen des Typs DateTime lässt sich ein Datum zwischen dem 1. Januar 01 und dem 31. Dezember 9999 behandeln – nach dem gregorianischen Kalender. Die Grenzen sind in den klassengebundenen schreibgeschützten Feldern MinValue und MaxValue gespeichert.
10.5.1 Die Zeitspanne Tick
Die Einheit der Zeitmessung ist 100 Nanosekunden. Sie wird als Tick bezeichnet.
Damit braucht bereits ein Tag eine zwölfstellige Zahl zur Zählung der Ticks. Ein Long ist sehr viel größer, sodass der gesamte Bereich seit Beginn unserer Zeitrechnung bis zum Ende des Jahres 9999 abdeckt werden kann (es könnten sogar knapp 30.000 Jahre sein). Die Ticks definieren einen Zeitpunkt, der dem Konstruktor übergeben werden kann. Im folgenden Codefragment addieren wir die Anzahl der Ticks in einer Sekunde zur aktuellen Tickzahl.
Dim d As DateTime = Now Console.WriteLine("{0} ist eine Sekunde vor {1}", _ d, New DateTime(d.Ticks + TimeSpan.TicksPerSecond))
Die Ausgabe lautet:
30.12.2008 15:14:43 ist eine Sekunde vor 30.12.2008 15:14:44
10.5.2 Konstruktoren von DateTime
Ein neuer Zeitpunkt kann entweder durch eine Tickanzahl oder durch Tages- und Zeitangaben definiert werden. Die Enumeration DateTimeKind gibt den Bezug an: unspezifiziert (Unspecified), Weltzeit (Utc) oder lokale Zeit (Local). Vordefinierte Kalender vom Typ System. Globalization.Calendar umfassen auch nah- und fernöstliche Varianten. Sie ordnen den Zeitangaben Wochen, Monate und Jahre zu, was auch die Formatierung beeinflusst. In der folgenden Syntax sind optionale Parameter kursiv gesetzt.
Public Sub New(ticks As Long, kind As DateTimeKind) Public Sub New(year As Integer, month As Integer, day As Integer, _ calendar As Calendar) Public Sub New(year As Integer, month As Integer, day As Integer, _ hour As Integer, minute As Integer, second As Integer, _ millisecond As Integer, calendar As Calendar, kind As DateTimeKind) |
Eine fehlende Zeit wird durch Mitternacht ersetzt. Sind die Jahreszahlen nicht zwischen 1 und 9999 oder sind die weiteren Angaben ungültig, wird eine Ausnahme ausgelöst. Die Datumszählung beginnt jeweils bei 1, die Zeitzählung jeweils bei 0.
Liegt ein DateTime-Objekt vor, lässt sich die Zeitbasis nicht mehr verändern. Sie können die Einstellung jedoch mit der Eigenschaft Kind jederzeit auslesen.
10.5.3 Eigenschaften von DateTime
Für jedes Datums- und Zeitelement gibt es eine Eigenschaft: Year, Month, Day, Hour, Minute, Second und Millisecond. Den Wochentag bekommen Sie mit DayOfWeek vom Typ der gleichnamigen Enumeration. Monatsnamen sind nicht vorgesehen und müssen bei Bedarf selbst implementiert werden. Das folgende Codefragment gibt einen Zeitpunkt aus:
Dim d As DateTime = Now Console.WriteLine("{0}, {1}.{2}.{3} {4}:{5}:{6},{7}", d.DayOfWeek, _ d.Day, d.Month, d.Year, d.Hour, d.Minute, d.Second, d.Millisecond)
Das Format entspricht deutschen Gepflogenheiten:
Dienstag, 30.12.2008 16:5:19,405
Now liefert die aktuelle Systemzeit und hängt damit unter Windows-Plattformen von der Einstellung in der Systemsteuerung ab. Eine sehr ähnliche Eigenschaft ist UtcNow, die aus den Einstellungen in der Systemsteuerung die Greenwich Mean Time (GMT) ermittelt.
Wenn auf eine Zeitangabe verzichtet werden kann, verwenden Sie die klassengebundene Eigenschaft Today, die das Datum ohne Zeitangabe liefert. Diese wird auf 00:00:00 gesetzt.
10.5.4 Methoden von DateTime
Nahezu alle Methoden der Klasse lassen sich in zwei Gruppen zusammenfassen:
- Umwandlungen
- Add-Methoden, mit denen zu einem Datum eine Zeitspanne addiert oder subtrahiert wird
Umwandlungen
Vier Methoden erlauben eine einfache Ausgabe eines Zeitpunkts:
Dim d As New DateTime(2006, 2, 3, 5, 25, 30) '3.Februar 2006 5:25:30 Console.WriteLine(d.ToLongDateString()) 'Freitag, 3. Februar 2006 Console.WriteLine(d.ToShortDateString()) '03.02.2006 Console.WriteLine(d.ToLongTimeString()) '05:25:30 Console.WriteLine(d.ToShortTimeString()) '05:25
Formatieren Sie die Ausgabe selbst, können der Test IsLeapYear auf ein Schaltjahr und der Test IsDaylightSavingTime auf Sommerzeit nützlich sein.
Ist ein Zeitpunkt als Zeichenkette gegeben, können Sie ihn mit Parse, ParseExact, TryParse und TryParseExact in ein DateTime-Objekt umwandeln.
Rechenoperationen
Eine ganz einfache Operation ist der Vergleich zweier Zeitpunkte. Entweder Sie verwenden Equals, Compare, CompareTo oder Vergleichsoperatoren, zum Beispiel:
Dim d As New DateTime(2006, 2, 3, 5, 25, 30) Console.WriteLine("d<Now: {0}", d < Now)
Die einzig sinnvollen Rechenoperationen sind Additionen und Subtraktionen.
Public Function Add(value As TimeSpan) As DateTime Public Function AddDays(value As Double) As DateTime Public Function AddHours(value As Double) As DateTime Public Function AddMilliseconds(value As Double) As DateTime Public Function AddMinutes(value As Double) As DateTime Public Function AddMonths(months As Integer) As DateTime Public Function AddSeconds(value As Double) As DateTime Public Function AddTicks(value As Long) As DateTime Public Function AddYears(value As Integer) As DateTime Public Function Subtract(value As DateTime) As TimeSpan Public Function Subtract(value As TimeSpan) As DateTime |
Im folgenden Codefragment wird ein DateTime-Objekt erzeugt, das das Datum 2. August 1995 und die Zeit 23:00 Uhr beschreibt. Davon werden mit der Methode AddHours 30 Stunden subtrahiert:
DateTime now = new DateTime(1995, 8, 2, 23, 0, 0); now = now.AddHours(-30); Console.WriteLine(now);
Die Ausgabe zeigt, dass ein aus der Addition resultierendes neues Datum automatisch berücksichtigt wird.
01.08.1995 17:00:00
Für Zeitmessungen im eigenen Coding sind oft Sekundenangaben interessant. Der einfachste Weg geht über die Subtraktion der Ticks, zum Beispiel:
Dim t0 As DateTime = Now ' Rechnungen Console.Write("Rechenzeit {0} Sekunden", _ (Now.Ticks – t0.Ticks)/TimeSpan.TicksPerSecond)
10.5.5 Zeitspanne: TimeSpan
Während DateTime einen festen Zeitpunkt beschreibt, ist TimeSpan eine Zeitspanne ohne Bezugspunkt. Die Konstruktoren haben konsequenterweise keine Jahresangabe. In der folgenden Syntax sind optionale Parameter kursiv gesetzt:
Public Sub New(ticks As Long) Public Sub New(days As Integer, hours As Integer, minutes As Integer, _ seconds As Integer, milliseconds As Integer) |
Häufig werden Zeitspannen in der Add-Methode der Klasse DateTime verwendet.
Dim punkt As New DateTime(2002, 2, 3, 12, 0, 0) Dim spanne As New TimeSpan(3, 12, 15) punkt = punkt.Add(spanne) Console.WriteLine(punkt)
In der ersten Codezeile wird das Datum 3. Februar 2002 12:00 Uhr instanziiert. Der folgende Konstruktor mit drei Parametern definiert 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 und umgekehrt: TicksPerMillisecond, TicksPerSecond, TicksPerMinute, TicksPerHour und TicksPerDay. Damit können Sie alternativ alle Rechnungen in Einheiten eines Ticks ausführen und anschließend durch eine der Konstanten dividieren, um die Angabe in der entsprechenden Einheit zu erhalten.
Formatierung
Eine TimeSpan-Instanz beschreibt eine Zeitspanne aus Tagen, Stunden, Minuten, Sekunden und Millisekunden. Sie lässt sich in einem String folgenden Formats abbilden:
Tag.Stunden:Minuten:Sekunden.Sekundenbruchteil
Dazu ein Beispiel. Mit
Dim spanne As New TimeSpan(2, 12, 30, 22, 100) Console.WriteLine(spanne.ToString())
erhalten Sie die Ausgabe:
2.12:30:22.1000000
Umrechnung
Die Zeitspanne in Tagen, Stunden, Minuten, Sekunden oder Millisekunden ist in den entsprechenden schreibgeschützten Eigenschaften gespeichert. Zu jeder der Zeiteinheiten als ganzzahligem Wert gibt es noch die durch das Präfix Total gekennzeichnete Variante als Fließkommazahl. Die ersten Werte geben die Anzahl dieser Einheit an, die zweiten drücken die gesamte Zeitspanne in der entsprechenden Einheit aus.
Zum Beispiel liefert das Codefragment
Dim spanne As New TimeSpan(3, 12, 15)
Console.WriteLine("{0} / {1}", spanne.Minutes, spanne.TotalMinutes)
die Ausgabe:
12 / 192,25
Einige statische Methoden des Typs TimeSpan ermöglichen es auch ohne Initialisierung, einer TimeSpan-Variablen einen Wert zuzuweisen: FromTicks, FromMilliseconds, FromSeconds, FromMinutes, FromDays. Zum Beispiel:
Dim ts As TimeSpan = TimeSpan.FromHours(3) '3 Stunden
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.