2009-10-14 5 views
6

Est-ce que quelqu'un a une fonction simple pour convertir une date en une chaîne simple (en utilisant .Net)?Date comme texte simple (par exemple Hier, Hier, 1 Semaine) dans .Net

E.g. 14-Oct-09 lirait "Aujourd'hui", 13-Oct-09 lirait "Yesterday" et 7-Oct-09 lirait "1 semaine" etc ...

Cheers, Tim

+0

Prise intéressante. Je ne suis pas certain que vous allez obtenir une réponse au-delà de "rouler la vôtre" :) – JustLoren

+4

Une des toutes premières questions sur ce site a traité ce problème: http://stackoverflow.com/questions/11/how- do-i-calculate-relative-time –

+0

Et pour un moyen d'y parvenir en SQL (si jamais vous voulez): http://stackoverflow.com/questions/50149/best-way-to-convert-datetime-to -n-hours-ago-in-sql – CraigTP

Répondre

6

Vous devez en effet rouler votre propre méthode de faire cela, comme JustLoren dit.

Ceci est une méthode d'extension que j'ai utilisée. C'est GateKiller script fait dans une méthode d'extension. Donc crédit complet à lui. Vous pouvez facilement le changer comme bon vous semble.

public static string ToTimeSinceString(this DateTime value) 
{ 
    const int SECOND = 1; 
    const int MINUTE = 60 * SECOND; 
    const int HOUR = 60 * MINUTE; 
    const int DAY = 24 * HOUR; 
    const int MONTH = 30 * DAY; 

    TimeSpan ts = new TimeSpan(DateTime.Now.Ticks - value.Ticks); 
    double seconds = ts.TotalSeconds; 

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

    if (seconds < 60 * MINUTE) 
     return ts.Minutes + " minutes ago"; 

    if (seconds < 120 * MINUTE) 
     return "an hour ago"; 

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

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

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

    if (seconds < 12 * MONTH) { 
     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"; 
} 
+0

Cela semble provenir directement de la réponse acceptée sur la question à laquelle je suis lié dans les commentaires de la question; o) –

+0

Vraiment désolé à ce sujet. J'avais oublié d'où ça venait. Crédit ajouté pour répondre. – aolde

+0

Super, merci! M'a sauvé un certain temps :) – TimS

6

Quelque chose comme cette méthode d'extension?

public static string Stringfy(this DateTime date) 
{ 
    if ((DateTime.Now - date.Date).TotalDays == 0) 
     return "Today"; 

    if ((DateTime.Now - date.Date).TotalDays == 1) 
     return "Yesterday"; 

    // ... 

    return "A long time ago, in a galaxy far far away..."; 
} 
+3

+1 pour une galaxie très lointaine – Phil

+0

TotalDays n'est-il pas un double? Peut-être que Truncate est dans l'ordre pour obtenir des jours entiers ou même utiliser DateTime.Now.Date au lieu de DateTime.Now – Darren

Questions connexes