Des secondes aux années : calculer le temps relatif en C# correctement

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Introduction : Pourquoi avons-nous besoin du « temps relatif » ?

\n\n

Avez-vous déjà remarqué pourquoi les réseaux sociaux et les sites d'actualités écrivent « il y a 2 heures » ou « hier », plutôt que « 25.04.2025 14:32 » ? Parce que notre cerveau perçoit le temps relatif beaucoup plus rapidement. Une date absolue nécessite une analyse : « Ok, aujourd'hui on est le 25, donc c'était... ». Une date relative donne la réponse instantanément.

\n\n

Si vous programmez en C# — que ce soit une application web en ASP.NET, une application de bureau ou un bot Telegram — tôt ou tard, vous aurez besoin d'afficher à l'utilisateur l'heure au format « à l'instant », « il y a 3 minutes » ou « il y a environ un an ». Sur Stack Overflow, la question « Calculate relative time in C# » a recueilli des milliers de vues, ce qui montre que c'est une vraie difficulté pour les développeurs.

\n\n

Dans cet article, nous allons analyser la manière la plus correcte et la plus flexible de calculer le temps relatif en C#. Vous obtiendrez un code prêt à l'emploi que vous pourrez directement insérer dans votre projet, vous comprendrez son fonctionnement et vous apprendrez à le personnaliser selon vos besoins.

\n\n

Le problème : qu'est-ce qui cloche avec la simple soustraction de dates ?

\n\n

La première idée qui vient à l'esprit est de soustraire une date d'une autre et d'obtenir un TimeSpan. Oui, cela fonctionne. Mais le diable se cache dans les détails :

\n\n
    \n
  • Les seuils. Quand est-ce que la « minute » se termine et que l'« heure » commence ? Et quand est-ce que l'« heure » passe au « jour » ?
  • \n
  • Les dates futures. Que faire si la date est dans le futur ? Afficher « dans 5 minutes » ou « dans 1 jour » ?
  • \n
  • La lisibilité du code. Si vous dispersez la logique dans tout le projet, vous vous y perdrez vous-même au bout d'un mois.
  • \n
\n\n

C'est pourquoi nous n'avons pas besoin d'un simple bout de code, mais d'une méthode unique et réutilisable.

\n\n

La solution : une méthode universelle pour calculer le temps relatif

\n\n

La meilleure façon est d'écrire une seule méthode statique qui prend un DateTime (ou DateTimeOffset) et renvoie une chaîne de caractères élégante. Voici une implémentation de base, mais déjà très puissante, que l'on peut trouver dans les discussions sur Stack Overflow et adapter à ses besoins :

\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        // Important : comparer dans le même fuseau horaire !\n        var timeSpan = now - dateTime;\n\n        // Cas 1 : date dans le futur\n        if (timeSpan.TotalSeconds < 0)\n        {\n            // Calculer la valeur absolue pour le futur\n            timeSpan = timeSpan.Duration();\n            if (timeSpan.TotalMinutes < 1)\n                return "dans quelques secondes";\n            if (timeSpan.TotalMinutes < 60)\n                return $"dans {timeSpan.Minutes} min.";\n            if (timeSpan.TotalHours < 24)\n                return $"dans {timeSpan.Hours} h.";\n            if (timeSpan.TotalDays < 30)\n                return $"dans {timeSpan.Days} j.";\n            if (timeSpan.TotalDays < 365)\n                return $"dans {timeSpan.Days / 30} mois";\n            return $"dans {timeSpan.Days / 365} an(s)";\n        }\n\n        // Cas 2 : passé\n        if (timeSpan.TotalMinutes < 1)\n            return "à l'instant";\n        if (timeSpan.TotalMinutes < 60)\n            return $"{timeSpan.Minutes} min. plus tôt";\n        if (timeSpan.TotalHours < 24)\n            return $"{timeSpan.Hours} h. plus tôt";\n        if (timeSpan.TotalDays < 7)\n            return $"{timeSpan.Days} j. plus tôt";\n\n        // Pour les dates de plus d'une semaine, utiliser les jours\n        if (timeSpan.TotalDays < 30)\n            return $"{(int)timeSpan.TotalDays} j. plus tôt";\n        if (timeSpan.TotalDays < 365)\n        {\n            int months = (int)(timeSpan.TotalDays / 30);\n            return $"{months} mois plus tôt";\n        }\n\n        int years = (int)(timeSpan.TotalDays / 365);\n        return $"{years} an(s) plus tôt";                

Blogs

Book Recommendations