CodeGym /Kurse /C# SELF /Grundlegende Typen für die Arbeit mit Zeit

Grundlegende Typen für die Arbeit mit Zeit

C# SELF
Level 15, Lektion 0
Verfügbar

1. Einführung in den Typ DateTime

Datum und Zeit sind so ein grundlegender Baustein jeder Business-Logik, dass man sie selbst in den einfachsten Projekten nicht ignorieren kann. Oft muss man wissen, wann sich ein User registriert hat, wann eine Mail verschickt werden soll, einen Flugplan korrekt verarbeiten, Zeitzonen – überall gibt’s Daten! Aber wie die Praxis zeigt, ist die Arbeit mit Datum und Zeit eines der tückischsten Themen in der Programmierung. 😅

C# bietet zwei besonders wichtige Typen für die Arbeit mit Zeit: DateTime und DateTimeOffset. Kurz gesagt – einer für einfache Szenarien, der andere für Aufgaben, die mit Zeitzonen und genauer Zeitangabe zu tun haben.

Was ist DateTime?

Der Typ DateTime ist eine Struktur, die im Namespace System definiert ist. Sie ist dafür gedacht, Datum und Zeit mit einer Genauigkeit von 100 Nanosekunden (1/10 Milliardstel Sekunde) zu speichern.

  • Werttyp (struct), wird also per Wert kopiert.
  • Enthält sowohl Datum als auch Zeit.
  • Erlaubt das Speichern von nur einem Datum (2025-05-24) oder Datum mit Zeit (2025-05-24 15:17:42).
  • „Weiß“ nichts über Zeitzonen, wenn es nicht explizit angegeben wird.

2. Erstellen von DateTime

Es gibt mehrere Varianten, schauen wir uns die wichtigsten an.

1. Aktuelles Datum und Zeit

DateTime now = DateTime.Now;           // Lokale Zeit des Computers
DateTime utcNow = DateTime.UtcNow;     // Zeit nach Greenwich (UTC)
  • Now – das ist „wie auf deinem Computer“, mit Berücksichtigung der lokalen Windows-Zeitzone.
  • UtcNow – „universell“, also koordinierte Weltzeit. Sehr praktisch zum Speichern von Zeit, z.B. in Datenbanken oder Systemen, die weltweit laufen.

2. Konstruktoren

// Jahr, Monat, Tag
var date1 = new DateTime(2025, 5, 24);

// Jahr, Monat, Tag, Stunde, Minute, Sekunde
var date2 = new DateTime(2025, 5, 24, 12, 0, 0);

// Jahr, Monat, Tag, Stunde, Minute, Sekunde, Millisekunde
var date3 = new DateTime(2025, 5, 24, 12, 0, 0, 500);

Monate werden nicht ab null gezählt! Also Januar ist 1, Dezember ist 12.

3. Parsen aus einem String

Sehr oft kommt ein Datum als String! Zum Beispiel gibt der User das Datum manuell ein.

string userInput = "2025-05-24 18:30";
DateTime parsed = DateTime.Parse(userInput); // Kann eine Exception werfen!

Für sicheres Parsen – benutze TryParse:

string input = "2025-05-24 18:30";
if (DateTime.TryParse(input, out DateTime result))
{
    Console.WriteLine($"Erfolgreich konvertiert: {result}");
}
else
{
    Console.WriteLine("Konnte den String nicht in ein Datum umwandeln.");
}

4. Datum „ohne Zeit“ bekommen

DateTime today = DateTime.Today; // Aktueller Tag, aber Zeit = 00:00:00

Komponenten von Datum und Zeit extrahieren

Alle Properties kannst du easy bekommen:

var dt = new DateTime(2025, 5, 24, 15, 17, 42);

int year = dt.Year;         // 2025
int month = dt.Month;       // 5 (Mai)
int day = dt.Day;           // 24
int hour = dt.Hour;         // 15
int minute = dt.Minute;     // 17
int second = dt.Second;     // 42
DayOfWeek dow = dt.DayOfWeek; // Freitag

3. Arbeiten mit dem Typ DateTime

Datum addieren und subtrahieren

Zeit in der Programmierung ist schnelllebig, und damit du nicht selbst „wie viele Stunden bis zur Deadline?“ rechnen musst, gibt’s Methoden der Klasse:

DateTime now = DateTime.Now;
DateTime tomorrow = now.AddDays(1); // Morgen
DateTime afterFiveHours = now.AddHours(5); // In 5 Stunden
DateTime inTenMinutes = now.AddMinutes(10); // In 10 Minuten

Differenz zwischen zwei Daten: TimeSpan

Der Unterschied zwischen zwei Daten ist eine eigene Größe, Typ TimeSpan:

DateTime deadline = new DateTime(2026, 6, 1);
DateTime now = DateTime.Now;

TimeSpan untilDeadline = deadline - now;

Console.WriteLine($"Tage bis zur Deadline: {untilDeadline.Days}");
Console.WriteLine($"Stunden bis zur Deadline: {untilDeadline.TotalHours:N2}");

TimeSpan ist die „Differenz“, nicht ein „konkretes Datum/Zeit“!

Prüfen, ob ein Datum in der Zukunft/Vergangenheit liegt

if (deadline > now)
    Console.WriteLine("Deadline ist noch vor dir!");
else
    Console.WriteLine("Deadline ist schon vorbei! Schnell abgeben!");

4. Wie werden Daten unter der Haube gespeichert

Damit das Addieren und Subtrahieren von Daten bequem ist, haben Programmierer entschieden, alle Daten als Anzahl der Sekunden seit Beginn unserer Zeitrechnung zu speichern. Wertebereich:

Property Wert
Minimales Datum
DateTime.MinValue
= 0001-01-01 00:00:00
Maximales Datum
DateTime.MaxValue
= 9999-12-31 23:59:59.9999999
Maßeinheit 1 Tick = 100 Nanosekunden

DateTime speichert nicht einfach die Anzahl der Sekunden, sondern die Anzahl der „Ticks“ (ticks) seit einem besonderen Datum – 1. Januar 0001 (ja, Programmierer kennen keine Dinosaurier, deren Zeitrechnung ist strenger). Ein Tick = 100 Nanosekunden.

5. Typ DateTimeOffset

Manchmal reicht der Typ DateTime nicht aus. Klassischer Fall: Eine Firma arbeitet in zwei Ländern, sie haben verschiedene Zeitzonen, aber alle Meetings sind „nach meiner Zeit“ geplant. Was tun?

Zeit, die als DateTime gespeichert ist, ist oft „abstrakt“: Das ist einfach eine Zahlenreihe und ein Tick, solange du nicht explizit sagst, in welcher Zone das war. Wenn du z.B. "2025-05-24 15:00" bekommst, kannst du nicht sicher sein – ist das Nairobi-Zeit? Bagdad? Berlin? (und wenn noch Sommerzeit ist – halt dich fest!).

Deshalb gibt’s für Aufgaben, bei denen es auf den exakten Zeitpunkt ankommt, nicht nur auf das „Kalenderdatum“, einen zweiten Typ – DateTimeOffset. Erstellen eines DateTimeOffset mit Angabe des Offsets (z.B. Nairobi +3 zu UTC):


var localTime = new DateTimeOffset(2025, 5, 24, 15, 0, 0, TimeSpan.FromHours(3));

Benutze DateTimeOffset, wenn:

  • Du den exakten Zeitpunkt wissen musst (z.B. für Events im Log, die an Serverzeit gebunden sind).
  • Dein Programm mit Usern in verschiedenen Zeitzonen arbeitet.
  • Du Zeit mit Angabe der Zone speichern/übertragen musst (z.B. für Transaktionen, Events, Zeitpläne).

6. Wie erstellt man DateTimeOffset?

  1. Aktueller Zeitpunkt
    DateTimeOffset now = DateTimeOffset.Now; // Lokale Zeit + Offset
    DateTimeOffset utc = DateTimeOffset.UtcNow; // UTC (Offset 0)
    
  2. Explizites Erstellen
    // Jahr, Monat, Tag, Stunde, Minute, Sekunde, Offset (z.B. +2 Stunden)
    DateTimeOffset custom = new DateTimeOffset(2025, 5, 24, 20, 0, 0, TimeSpan.FromHours(2));
    
  3. Konvertierung aus DateTime
    DateTime dt = DateTime.Now;
    DateTimeOffset dto = new DateTimeOffset(dt); // Lokales Offset wird automatisch übernommen
    

Komponenten extrahieren

DateTimeOffset dto = DateTimeOffset.Now;
var datePart = dto.Date;      // Nur das Datum
var timePart = dto.TimeOfDay; // Nur die Zeit
var offset = dto.Offset;      // Offset zu UTC, z.B. 03:00:00

Umwandlung zwischen Zeitzonen

Magie der Offsets:

// Datum in UTC bekommen
var now = DateTimeOffset.Now;
var utc = now.ToUniversalTime();
Console.WriteLine(utc); // Zeit nach Greenwich

// In eine andere Zone umwandeln
var berlinTime = utc.ToOffset(TimeSpan.FromHours(2));
Console.WriteLine(berlinTime); // Für Berlin (CET +2)

7. Wann DateTime und wann DateTimeOffset?

Philosophie der Wahl

Wenn es um etwas Einfaches und Lokales geht – z.B. Geburtstag, Veröffentlichungsdatum eines Artikels oder eine Deadline für eine Umfrage bis 15:00 – reicht meistens DateTime. In solchen Fällen ist die absolute Zeit nicht kritisch, wichtig ist nur, dass das Event an einem bestimmten Tag und zu einer bestimmten Stunde passiert ist, ohne Bezug zur Zeitzone.

Aber wenn du einen exakten Zeitpunkt mit Zeitzonenbezug festhalten musst, z.B. in Logs, Transaktionen oder verteilten Systemen – dann besser DateTimeOffset nehmen. Damit kommst du nicht durcheinander, wenn du Zeit zwischen Systemen überträgst, besonders wenn sie in verschiedenen Zeitzonen sind.

Szenario Typ Warum
Geburtstag
DateTime
Nur das Datum ist wichtig, Zone ist egal (meistens)
Login-Zeit
DateTimeOffset
Exakter Zeitpunkt und Offset sind wichtig
Ablaufdatum eines Produkts
DateTime
Ablaufdatum, Zone ist egal
Zeit eines Events im Log
DateTimeOffset
Am besten immer mit Offset speichern
2
Aufgabe
C# SELF, Level 15, Lektion 0
Gesperrt
Ausgabe des aktuellen Datums und der aktuellen Uhrzeit in verschiedenen Formaten
Ausgabe des aktuellen Datums und der aktuellen Uhrzeit in verschiedenen Formaten
2
Aufgabe
C# SELF, Level 15, Lektion 0
Gesperrt
Addition und Subtraktion von Zeit
Addition und Subtraktion von Zeit
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION