CodeGym /Kurse /C# SELF /Berechnungen und Hilfsklassen für Datum und Zeit

Berechnungen und Hilfsklassen für Datum und Zeit

C# SELF
Level 15, Lektion 4
Verfügbar

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
Days
Ganze Anzahl der Tage
Hours
Stundenanteil
Minutes
Minutenanteil
Seconds
Sekundenanteil
TotalDays
Zeit in Tagen (mit Nachkommastellen)
TotalHours
Zeit in Stunden (mit Nachkommastellen)
TotalMinutes
Zeit in Minuten (mit Nachkommastellen)
TotalSeconds
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)
AddDays(double)
Tage (auch Kommazahlen, z.B. 1,5 Tage)
AddMonths(int)
Monate (berücksichtigt automatisch die Monatslänge)
AddYears(int)
Jahre (auch Schaltjahre werden beachtet)
AddHours(double)
Stunden
AddMinutes(double)
Minuten
AddSeconds(double)
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
TimeSpan duration = d2 - d1
(d2 - d1).Days
2 Wochen zu einem Datum addieren
date.AddDays(14)
date.AddDays(14)
Alter berechnen Formel mit
.Year
und Prüfung von Monat/Tag
Siehe Abschnitt oben
Nur das Datum bekommen/setzen
DateOnly
DateOnly.FromDateTime(DateTime.Now)
Nur die Zeit bekommen/setzen
TimeOnly
TimeOnly.FromDateTime(DateTime.Now)
Daten vergleichen Operatoren
<
,
>
,
==
,
.CompareTo()
if (d1 < d2) ...
In eine andere Zeitzone umrechnen
DateTimeOffset + ToOffset
dto.ToOffset(TimeSpan.FromHours(3))
Wochennummer im Jahr herausfinden
Calendar.GetWeekOfYear()
siehe Dokumentation
Wochentag herausfinden
date.DayOfWeek
Arbeitstage zählen Schleife mit Prüfung
DayOfWeek
Siehe Abschnitt oben
2
Aufgabe
C# SELF, Level 15, Lektion 4
Gesperrt
Differenz zwischen zwei Daten
Differenz zwischen zwei Daten
2
Aufgabe
C# SELF, Level 15, Lektion 4
Gesperrt
Wochentag
Wochentag
1
Umfrage/Quiz
Arbeiten mit Daten, Level 15, Lektion 4
Nicht verfügbar
Arbeiten mit Daten
Arbeiten mit Daten, Zeit und Zeitzonen
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION