2009-10-14 8 views
6

Czy ktoś ma prostą funkcję do ręcznego przekształcania daty na prosty ciąg (przy użyciu .Net)?Data jako prosty tekst (np. Dzisiaj, Wczoraj, 1 Tydzień Temu) w .Net

E.g. 14-Oct-09 będzie czytać "Today", 13-paź-09 będzie czytać "wczoraj" i 7-paź-09 będzie czytać "1 Tydzień temu" itp ...

Wiwaty, Tim

+0

Interesujące spojrzenie. Nie jestem pewien, czy dostaniesz odpowiedź poza "roll your own" :) – JustLoren

+4

Jedno z pierwszych pytań na tej stronie dotyczyło tego problemu: http://stackoverflow.com/questions/11/how- do-i-calcul-relative-time –

+0

I dla sposobu osiągnięcia tego w SQL (jeśli kiedykolwiek będziesz chciał): http://stackoverflow.com/questions/50149/best-way-to-convert-datetime-to -n-hours-ago-in-sql – CraigTP

Odpowiedz

6

Rzeczywiście musiałbyś przetoczyć własną metodę robienia tego, jak powiedział JustLoren.

Jest to metoda rozszerzenia, z której korzystałem. Jest to skrypt wykonany w metodzie rozszerzania. Tak mu się należało. Możesz go łatwo zmienić, jak chcesz.

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

To wydaje się pochodzić prosto z zaakceptowanej odpowiedzi na pytanie, które łączyłem w komentarzach do pytania; o) –

+0

Naprawdę przykro mi z tego powodu. Zapomniałem, skąd się to wzięło. Dodano kredyt do udzielenia odpowiedzi. – aolde

+0

Świetnie, dziękuję! Zaoszczędził mi trochę czasu :) – TimS

6

Coś jak ta metoda rozszerzenia?

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 dla galaktyki daleko stąd – Phil

+0

Czy TotalDays nie jest podwójny? Może Truncate jest w celu uzyskania całych dni lub nawet użyć DateTime.Now.Date zamiast DateTime.Now – Darren

Powiązane problemy