kzen.dev
  • Questions
  • Tags
  • Utilisateurs
Notifications
Récompenses
Inscription
Une fois inscrit, vous serez informé des réponses et des commentaires à vos questions.
Connectez-vous
Si vous avez déjà un compte, connectez-vous pour vérifier les nouvelles notifications.
Il y aura des récompenses pour les questions, réponses et commentaires ajoutés.
Détails
Source
Editer
Jeff Atwood
Jeff Atwood
Question

Calculer le temps relatif en C#

Étant donné une valeur DateTime spécifique, comment puis-je afficher le temps relatif, comme :

  • il y a 2 heures
  • il y a 3 jours
  • il y a un mois
1453 2008-07-31T23:55:37+00:00 3
Bijender  Singh Shekhawat
Bijender Singh Shekhawat
Question modifiée 4 juin 2017 в 3:51
Programmation
datetime
c#
time
datediff
relative-time-span
Vidéos populaires
C# Code for Age Calculate using Datetimepicker and TextBox in .net
C# Code for Age Calculate using Datetimepicker and TextBox in .net
il y a 7 ans
C# Tutorial 64:  How do I calculate relative time (e.g. calculate someone's age)
C# Tutorial 64: How do I calculate relative time (e.g. calculate someone's age)
il y a 9 ans
How can relative time be calculated in C#
How can relative time be calculated in C#
il y a 6 ans
part 2 calculate relative time in C#
part 2 calculate relative time in C#
il y a 6 ans
Calculate The Time Difference  Between Two DateTimePicker In C#
Calculate The Time Difference Between Two DateTimePicker In C#
il y a 2 ans
2 - C# (C sharp) /  "Hello C#" (Variables, constantes, comment, entrée et sortie)Partie 1
2 - C# (C sharp) / "Hello C#" (Variables, constantes, comment, entrée et sortie)Partie 1
il y a 6 ans
C# 14 Working with DateTime in C#.
C# 14 Working with DateTime in C#.
il y a 8 ans
Développement d'application Client-Serveur en C# - Part80 - EFM Régional Questions de cours
Développement d'application Client-Serveur en C# - Part80 - EFM Régional Questions de cours
il y a 2 ans
Développement d'appli client-serveur en C# - Part50 - Correction EFM Rég 2020 V4 - Q5 TP
Développement d'appli client-serveur en C# - Part50 - Correction EFM Rég 2020 V4 - Q5 TP
il y a 2 ans
WPF (M.V.VM) - C# .net  - Séance 1 - Introduction
WPF (M.V.VM) - C# .net - Séance 1 - Introduction
il y a 2 ans
Apprenez à développer en C# - Correction du TP 3
Apprenez à développer en C# - Correction du TP 3
il y a 2 ans
chap 8 la relativité restreinte
chap 8 la relativité restreinte
il y a 6 ans
CRÉER UN TIMER EN C#
CRÉER UN TIMER EN C#
il y a 2 ans
Переменные и типы данных в C#
Переменные и типы данных в C#
il y a 5 ans
« Précédent
Suivant »
Cette question a 1 réponse en anglais, pour les lire connectez-vous à votre compte.
Solution / Réponse
Vincent Robert
Vincent Robert
4 août 2008 в 1:57
2008-08-04T13:57:26+00:00
Détails
Source
Editer
#8406140

Jeff, votre code est joli mais pourrait être plus clair avec des constantes (comme suggéré dans Code Complete).

const int SECOND = 1;
const int MINUTE = 60 * SECOND;
const int HOUR = 60 * MINUTE;
const int DAY = 24 * HOUR;
const int MONTH = 30 * DAY;

var ts = new TimeSpan(DateTime.UtcNow.Ticks - yourDate.Ticks);
double delta = Math.Abs(ts.TotalSeconds);

if (delta < 1 * MINUTE)
  return ts.Seconds == 1 ? "one second ago" : ts.Seconds + " seconds ago";

if (delta < 2 * MINUTE)
  return "a minute ago";

if (delta < 45 * MINUTE)
  return ts.Minutes + " minutes ago";

if (delta < 90 * MINUTE)
  return "an hour ago";

if (delta < 24 * HOUR)
  return ts.Hours + " hours ago";

if (delta < 48 * HOUR)
  return "yesterday";

if (delta < 30 * DAY)
  return ts.Days + " days ago";

if (delta < 12 * MONTH)
{
  int months = Convert.ToInt32(Math.Floor((double)ts.Days / 30));
  return months <= 1 ? "one month ago" : months + " months ago";
}
else
{
  int years = Convert.ToInt32(Math.Floor((double)ts.Days / 365));
  return years <= 1 ? "one year ago" : years + " years ago";
}
 Community
Community
Réponse modifiée 23 mai 2017 в 12:10
953
0
Jeff Atwood
Jeff Atwood
31 juillet 2008 в 11:56
2008-07-31T23:56:41+00:00
Détails
Source
Editer
#8406138

Voici comment je procède

var ts = new TimeSpan(DateTime.UtcNow.Ticks - dt.Ticks);
double delta = Math.Abs(ts.TotalSeconds);

if (delta < 60)
{
  return ts.Seconds == 1 ? "one second ago" : ts.Seconds + " seconds ago";
}
if (delta < 120)
{
  return "a minute ago";
}
if (delta < 2700) // 45 * 60
{
  return ts.Minutes + " minutes ago";
}
if (delta < 5400) // 90 * 60
{
  return "an hour ago";
}
if (delta < 86400) // 24 * 60 * 60
{
  return ts.Hours + " hours ago";
}
if (delta < 172800) // 48 * 60 * 60
{
  return "yesterday";
}
if (delta < 2592000) // 30 * 24 * 60 * 60
{
  return ts.Days + " days ago";
}
if (delta < 31104000) // 12 * 30 * 24 * 60 * 60
{
  int months = Convert.ToInt32(Math.Floor((double)ts.Days / 30));
  return months <= 1 ? "one month ago" : months + " months ago";
}
int years = Convert.ToInt32(Math.Floor((double)ts.Days / 365));
return years <= 1 ? "one year ago" : years + " years ago";

Des suggestions ? Des commentaires ? Des moyens d'améliorer cet algorithme ?

 Knickerless-Noggins
Knickerless-Noggins
Réponse modifiée 12 janvier 2018 в 4:10
326
0
Nick Berardi
Nick Berardi
1er août 2008 в 12:17
2008-08-01T12:17:19+00:00
Détails
Source
Editer
#8406139

@jeff

À mon avis, la vôtre semble un peu longue. Cependant, il semble un peu plus robuste avec le support pour "hier" et "années". Mais d'après mon expérience, lorsque ce système est utilisé, la personne est plus susceptible de consulter le contenu au cours des 30 premiers jours. Seules les personnes les plus exigeantes viennent ensuite. C'est pourquoi j'opte généralement pour un système court et simple.

Voici la méthode que j'utilise actuellement sur l'un de mes sites Web. Elle ne renvoie que le jour, l'heure et le temps relatifs. Et ensuite l'utilisateur doit cliquer sur "ago" dans la sortie.

public static string ToLongString(this TimeSpan time)
{
    string output = String.Empty;

    if (time.Days > 0)
        output += time.Days + " days ";

    if ((time.Days == 0 || time.Days == 1) && time.Hours > 0)
        output += time.Hours + " hr ";

    if (time.Days == 0 && time.Minutes > 0)
        output += time.Minutes + " min ";

    if (output.Length == 0)
        output += time.Seconds + " sec";

    return output.Trim();
}
Nick Berardi
Nick Berardi
Réponse modifiée 1er août 2008 в 1:16
29
0
Ajouter une question
Catégories
Toutes
Technologie
Culture / Loisirs
Vie / Arts
Science
Professionnel
Entreprises
Utilisateurs
Tous
Nouveau
Populaire
1
Ilya Smirnov
Enregistré il y a 5 jours
2
Денис Васьков
Enregistré il y a 1 semaine
3
Dima Patrushev
Enregistré il y a 1 semaine
4
sirojidddin otaboyev
Enregistré il y a 2 semaines
5
Елена Гайдамамакинат
Enregistré il y a 2 semaines
DE
ES
FR
ID
JA
KO
PT
RO
RU
ZH
© kzen.dev 2023
Source
stackoverflow.com
sous licence cc by-sa 3.0 avec l'attribution