2009-10-14 10 views
6

Basit bir dize (.Net) kullanarak bir tarihi dönüştürmek için basit bir işleve sahip olan herkes var mı?Basit bir metin olarak tarih (ör. Bugün, Dün, 1 Hafta önce) .Net içinde

E.g. 14-Ekim-09 "Bugün", 13-Ekim-09 okurdum "Dün" ve 7-Ekim-09 ... vb "Önce 1 Hafta"

Cheers, Tim

+0

İlginç almak. "Kendi hesabını kendin yap" ın ötesinde bir cevap alacağından emin değilim :) – JustLoren

+4

Bu sitedeki ilk sorulardan biri, bu konuyla ilgileniyor: http://stackoverflow.com/questions/11/how- do-i-hesaplamak-göreceli zaman –

+0

Ve bunu SQL'de bir şekilde başarmak için (hiç): http://stackoverflow.com/questions/50149/best-way-to-convert-datetime-to -n-saat-önce-in-sql – CraigTP

cevap

6

okurdum okurdum Bunu yapmak için kendi yönteminizi kullanmak zorunda kalacaksınız, örneğin JustLoren gibi.

Bu, kullanmakta olduğum bir uzantı yöntemidir. Bir uzantı yöntemine yapılan GateKiller betiğidir. Yani ona tam kredi. İstediğin gibi kolayca değiştirebilirsin.

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

Bu soru yorumlarına bağlı olduğum soru üzerinde kabul edilen cevaptan doğrudan geliyor gibi görünüyor; o) –

+0

Gerçekten bu konuda üzgünüm. Nereden geldiğini unutmuştum. Cevap için kredi eklendi. – aolde

+0

Harika, teşekkürler! Bana biraz zaman kaydettim :) – TimS

6

Bu uzantı yöntemi gibi bir şey?

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 galaksiden uzaktadır – Phil

+0

TotalDays a double? Belki de tüm günler almak için DateTime.Now.Date yerine DateTime.Now kullanmak bir Truncate olabilir – Darren

İlgili konular