2009-10-14 4 views
6

Hat jemand eine einfache Funktion zum Konvertieren eines Datums in eine einfache Zeichenfolge (mit .Net)?Datum als einfacher Text (z. B. Heute, Gestern, Vor 1 Woche) in .Net

z. 14-Oct-09 lesen würde "Heute", 13-Oct-09 lesen würde "Yesterday" und 7-Oct-09 würde "1 vor einer Woche" usw. lesen ...

Cheers, Tim

+0

Interessante nehmen. Ich bin mir nicht sicher, ob Sie eine Antwort bekommen werden, die über "Selbst rollen" hinausgeht :) – JustLoren

+4

Eine der allerersten Fragen auf dieser Seite behandelte dieses Problem: http://stackoverflow.com/questions/11/how- do-i-calculate-relative-time –

+0

Und für eine Möglichkeit, dies in SQL zu erreichen (sollten Sie jemals wollen): http://stackoverflow.com/questions/50149/best-way-to-convert-datetime-to -n-hours-ago-in-sql – CraigTP

Antwort

6

Sie müssten in der Tat Ihre eigene Methode, dies zu tun, wie JustLoren sagte.

Dies ist eine Erweiterungsmethode, die ich verwendet habe. Es ist GateKiller Skript in eine Erweiterungsmethode gemacht. Also volle Anerkennung für ihn. Sie können es leicht ändern, wie Sie es wollen.

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

Das scheint direkt von der akzeptierten Antwort auf die Frage zu kommen, die ich in der Frage Kommentare verbunden habe; o) –

+0

Tut mir wirklich leid. Ich hatte vergessen, woher es kam. Kredit hinzugefügt, um zu antworten. – aolde

+0

Großartig, danke! Gespeichert hat mich einige Zeit :) – TimS

6

So etwas wie diese Erweiterungsmethode?

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 für weit entfernte Galaxie – Phil

+0

Ist TotalDays kein Double? Vielleicht ist eine Abkürzung, um die ganzen Tage zu erhalten oder sogar DateTime.Now.Date statt DateTime.Now zu verwenden – Darren

Verwandte Themen