Von Sekunden bis Jahren: Relative Zeit in C# korrekt berechnen

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung: Warum brauchen wir „relative Zeit“?

\n\n

Haben Sie sich jemals gefragt, warum soziale Netzwerke und Nachrichtenseiten „vor 2 Stunden“ oder „gestern“ schreiben, anstatt „25.04.2025 14:32“? Weil unser Gehirn relative Zeit viel schneller verarbeitet. Ein absolutes Datum erfordert Analyse: „Okay, heute ist der 25., also war das …“. Ein relatives Datum liefert die Antwort sofort.

\n\n

Wenn Sie in C# programmieren – sei es eine Webanwendung mit ASP.NET, eine Desktop-Anwendung oder ein Telegram-Bot – früher oder später werden Sie dem Benutzer die Zeit im Format „gerade eben“, „vor 3 Minuten“ oder „vor etwa einem Jahr“ anzeigen müssen. Auf Stack Overflow hat die Frage „Calculate relative time in C#“ tausende Aufrufe, was zeigt, dass dies ein echter Schmerzpunkt für Entwickler ist.

\n\n

In diesem Artikel analysieren wir die korrekteste und flexibelste Methode zur Berechnung relativer Zeit in C#. Sie erhalten fertigen Code, den Sie sofort in Ihr Projekt einfügen können, verstehen, wie er funktioniert, und erfahren, wie Sie ihn für beliebige Anforderungen anpassen können.

\n\n

Problem: Was ist falsch an einfacher Datumssubtraktion?

\n\n

Das Erste, was einem in den Sinn kommt, ist, ein Datum von einem anderen zu subtrahieren und einen TimeSpan zu erhalten. Ja, das funktioniert. Aber der Teufel steckt im Detail:

\n\n
    \n
  • Schwellenwerte. Wann endet eine „Minute“ und beginnt eine „Stunde“? Und wann geht eine „Stunde“ in einen „Tag“ über?
  • \n
  • Zukünftige Daten. Was ist, wenn das Datum in der Zukunft liegt? Soll „in 5 Minuten“ oder „in 1 Tag“ angezeigt werden?
  • \n
  • Lesbarkeit des Codes. Wenn Sie die Logik über das gesamte Projekt verstreuen, werden Sie sich in einem Monat selbst nicht mehr auskennen.
  • \n
\n\n

Daher brauchen wir nicht nur ein Code-Snippet, sondern eine einheitliche, wiederverwendbare Methode.

\n\n

Lösung: Universelle Methode zur Berechnung relativer Zeit

\n\n

Der beste Weg ist, eine einzige statische Methode zu schreiben, die ein DateTime (oder DateTimeOffset) akzeptiert und einen ansprechenden String zurückgibt. Hier ist eine grundlegende, aber bereits sehr leistungsfähige Implementierung, die in Diskussionen auf Stack Overflow zu finden ist und an Ihre Bedürfnisse angepasst werden kann:

\n\n
using System;\n\npublic static class TimeHelper\n{\n    public static string GetRelativeTime(DateTime dateTime)\n    {\n        var now = DateTime.Now;\n        var utcNow = DateTime.UtcNow;\n\n        // Wichtig: Vergleiche in derselben Zeitzone!\n        var timeSpan = now - dateTime;\n\n        // Fall 1: Datum in der Zukunft\n        if (timeSpan.TotalSeconds < 0)\n        {\n            // Berechne den absoluten Wert für die Zukunft\n            timeSpan = timeSpan.Duration();\n            if (timeSpan.TotalMinutes < 1)\n                return "in wenigen Sekunden";\n            if (timeSpan.TotalMinutes < 60)\n                return $"in {timeSpan.Minutes} Min.";\n            if (timeSpan.TotalHours < 24)\n                return $"in {timeSpan.Hours} Std.";\n            if (timeSpan.TotalDays < 30)\n                return $"in {timeSpan.Days} Tagen";\n            if (timeSpan.TotalDays < 365)\n                return $"in {timeSpan.Days / 30} Monaten";\n            return $"in {timeSpan.Days / 365} Jahren";\n        }\n\n        // Fall 2: Vergangenheit\n        if (timeSpan.TotalMinutes < 1)\n            return "gerade eben";\n        if (timeSpan.TotalMinutes < 60)\n            return $"{timeSpan.Minutes} Min. vor";\n        if (timeSpan.TotalHours < 24)\n            return $"{timeSpan.Hours} Std. vor";\n        if (timeSpan.TotalDays < 7)\n            return $"{timeSpan.Days} Tagen vor";\n\n        // Für Daten älter als eine Woche verwenden wir Tage\n        if (timeSpan.TotalDays < 30)\n            return $"{(int)timeSpan.TotalDays} Tagen vor";\n        if (timeSpan.TotalDays < 365)\n        {\n            int months = (int)(timeSpan.TotalDays / 30);\n            return $"{months} Monaten vor";\n        }\n\n        int years = (int)(timeSpan.TotalDays / 365);\n        return $"{years} Jahren vor";\n    }\n}\n

Blogs

Buchempfehlungen