1. Typische Aufgaben beim Arbeiten mit Datum und Zeit
Mit Datum und Zeit zu arbeiten, sorgt oft für ein leichtes (manchmal auch nicht so leichtes) Gefühl von Panik – selbst bei erfahrenen Entwicklern. Man muss Daten vergleichen, Intervalle berechnen, Tage/Monate/Jahre addieren oder abziehen, das Alter berechnen, den Wochentag bestimmen und vieles mehr.
Das sind typische Aufgaben für Task-Tracker und Kalender, Abo- oder Mitgliedschaftsverwaltung, Finanzberechnungen, Statistik-Reports und natürlich für Interview-Aufgaben (zum Beispiel: "Berechne die Anzahl der Arbeitstage zwischen zwei Daten").
In C# und .NET gibt es dafür eingebaute Klassen und Methoden. Und das Beste: Die meisten Berechnungen laufen über ein objektorientiertes, maximal sicheres und verständliches API.
2. Die Struktur TimeSpan – Zeitintervalle messen
Alles startet mit der Struktur TimeSpan. Das ist ein "Stück" Zeit: zum Beispiel 5 Tage, 3 Stunden, 7 Minuten und 21 Sekunden.
Wie erstellt man einen TimeSpan?
Du kannst zwei Daten voneinander abziehen oder explizit einen erstellen:
// Unterschied zwischen zwei Daten ist immer TimeSpan!
DateTime start = new DateTime(2025, 5, 1, 7, 0, 0);
DateTime end = new DateTime(2025, 5, 2, 11, 30, 0);
TimeSpan duration = end - start; // Pure Magie!
Console.WriteLine(duration); // 1.04:30:00 (1 Tag, 4 Stunden, 30 Minuten)
Du kannst TimeSpan auch explizit über die Konstruktor-Parameter erstellen:
TimeSpan span = new TimeSpan(2, 14, 18, 0); // 2 Tage, 14 Stunden, 18 Minuten, 0 Sekunden
Console.WriteLine(span); // 2.14:18:00
Alternativ geht's auch über statische Methoden, die oft lesbarer sind:
TimeSpan fiveMinutes = TimeSpan.FromMinutes(5);
TimeSpan twoHours = TimeSpan.FromHours(2);
TimeSpan oneWeek = TimeSpan.FromDays(7);
Welche Eigenschaften hat TimeSpan?
| Eigenschaft | Beschreibung |
|---|---|
|
Ganze Anzahl der Tage |
|
Stundenanteil |
|
Minutenanteil |
|
Sekundenanteil |
|
Zeit in Tagen (mit Nachkommastellen) |
|
Zeit in Stunden (mit Nachkommastellen) |
|
Zeit in Minuten (mit Nachkommastellen) |
|
Zeit in Sekunden (mit Nachkommastellen) |
Console.WriteLine($"Tage: {duration.Days}, Gesamtstunden: {duration.TotalHours}");
Wie fügt man TimeSpan zu einem Datum hinzu oder zieht es ab?
DateTime now = DateTime.Now;
DateTime future = now.Add(duration); // duration zu now addiert
DateTime past = now.Subtract(TimeSpan.FromDays(10)); // Minus 10 Tage
Console.WriteLine(future);
Console.WriteLine(past);
3. Datumsrechner: Unterschied zwischen Daten berechnen
Diese Fähigkeit brauchst du eigentlich immer. Zum Beispiel will jemand wissen, wie lange es noch bis zum Urlaub ist, oder wann die Gratisphase endet.
DateTime today = DateTime.Today;
DateTime vacation = new DateTime(2025, 8, 1);
TimeSpan untilVacation = vacation - today;
Console.WriteLine($"Bis zum Urlaub sind es noch {untilVacation.Days} Tage!");
Achtung: Wenn du nur "Daten" ohne Zeit (über DateTime.Date oder DateTime.Today) abziehst, ist das Ergebnis immer eine ganze Anzahl an Tagen. Sobald eine Zeit dabei ist, wird das Ergebnis eine Kommazahl.
int days = (vacation - today).TotalDays; // Kompilierfehler! TotalDays ist double
Wenn du eine ganze Zahl brauchst – nutze .Days oder caste (int)TotalDays.
4. Zeit addieren und abziehen: Methoden AddDays, AddMonths, AddHours, ...
C# verlangt nicht, dass du die Tage in jedem Monat, Schaltjahre und den ganzen Kram selbst zählst. Einfach so:
DateTime orderDate = new DateTime(2024, 4, 20);
DateTime deliveryDate = orderDate.AddDays(14); // In 2 Wochen
Console.WriteLine($"Die Ware wird geliefert am {deliveryDate.ToShortDateString()}");
| Methode | Was wird addiert (oder abgezogen bei negativer Zahl) |
|---|---|
|
Tage (auch Kommazahlen, z.B. 1,5 Tage) |
|
Monate (berücksichtigt automatisch die Monatslänge) |
|
Jahre (auch Schaltjahre werden beachtet) |
|
Stunden |
|
Minuten |
|
Sekunden |
DateTime birthday = new DateTime(2000, 2, 29);
DateTime nextYear = birthday.AddYears(1); // 2001-02-28 (nicht der 29., weil 2001 kein Schaltjahr ist)
Console.WriteLine(nextYear.ToShortDateString()); // 28.02.2001
Nicht vergessen: Alle Methoden geben eine neue Instanz des Datums zurück, das Original bleibt unverändert!
var dt = DateTime.Now;
dt.AddDays(5); // Das ändert dt NICHT!
dt = dt.AddDays(5); // Jetzt ist es geändert
5. Hilfsmethoden für Berechnungen
Wochentag berechnen
Meist reicht die Eigenschaft .DayOfWeek:
DateTime examDate = new DateTime(2025, 6, 19);
DayOfWeek day = examDate.DayOfWeek;
Console.WriteLine(day); // Wednesday
Du kannst das auch in eine Zahl umwandeln:
int number = (int)day; // Sunday == 0, Monday == 1, usw.
Prüfen auf "heute", "gestern", "morgen"
Ganz einfache Vergleiche:
DateTime date = new DateTime(2025, 6, 18);
if (date.Date == DateTime.Today)
Console.WriteLine("Heute!");
else if (date.Date == DateTime.Today.AddDays(-1))
Console.WriteLine("Gestern!");
else if (date.Date == DateTime.Today.AddDays(1))
Console.WriteLine("Morgen!");
Alter berechnen
Eine der häufigsten Aufgaben – das Alter einer Person korrekt berechnen. Einfach die Jahre abziehen reicht nicht immer:
public static int CalculateAge(DateTime birthDate, DateTime currentDate)
{
int age = currentDate.Year - birthDate.Year;
// Wenn der Geburtstag dieses Jahr noch nicht war
if (currentDate.Month < birthDate.Month ||
(currentDate.Month == birthDate.Month && currentDate.Day < birthDate.Day))
{
age--;
}
return age;
}
// Verwendung
DateTime birth = new DateTime(1990, 8, 15);
DateTime today = DateTime.Today;
int age = CalculateAge(birth, today);
Console.WriteLine($"Alter: {age} Jahre");
Mit Arbeitstagen arbeiten
Oft muss man die Anzahl der Arbeitstage zwischen zwei Daten berechnen, Wochenenden ausgeschlossen:
public static int CountWorkingDays(DateTime startDate, DateTime endDate)
{
int workingDays = 0;
DateTime current = startDate;
while (current <= endDate)
{
if (current.DayOfWeek != DayOfWeek.Saturday &&
current.DayOfWeek != DayOfWeek.Sunday)
{
workingDays++;
}
current = current.AddDays(1);
}
return workingDays;
}
6. Wie die wichtigsten Klassen zusammenhängen
graph TD
A(DateTime) --subtraktion--> B(TimeSpan)
A2(DateTime) --AddDays, AddMonths--> A
A --ToLocalTime/ToUniversalTime--> C(DateTimeOffset)
D(DateOnly) --ToDateTime--> A
E(TimeOnly) --ToTimeSpan--> B
A --DayOfWeek, Day, Month, Year--> F(Numerische Eigenschaften)
B(TimeSpan) --TotalDays, TotalHours, ...--> G(Dauer-Eigenschaften)
7. Schneller "Spickzettel": Was tun, wenn ...
| Aufgabe | Was benutzen | Beispiel |
|---|---|---|
| Unterschied zwischen Daten berechnen | |
|
| 2 Wochen zu einem Datum addieren | |
|
| Alter berechnen | Formel mit und Prüfung von Monat/Tag |
Siehe Abschnitt oben |
| Nur das Datum bekommen/setzen | |
|
| Nur die Zeit bekommen/setzen | |
|
| Daten vergleichen | Operatoren , , , |
|
| In eine andere Zeitzone umrechnen | |
|
| Wochennummer im Jahr herausfinden | |
siehe Dokumentation |
| Wochentag herausfinden | |
|
| Arbeitstage zählen | Schleife mit Prüfung |
Siehe Abschnitt oben |
GO TO FULL VERSION