2011-03-25 27 views
14

Bu sorunun başlığını yazarak beni this question'a getirdim. Aynı şeyi arıyorum, ama demek istediğimi alırsanız belki daha az statik olarak biçimlendirilmiş bir şey var mı?TimeSpan "pretty time" biçiminde C#

İki DateTime nesnesinin TimeSpan süresini çekecek ve bunları kağıda yazdırmak için çıkacak olan hızlı bir program yazıyorum.

Tercih edilen biçim şöyledir: XX days, YY hours, ZZ minutes (saniyeler alakasız; günlerdir, çünkü zaman çizelgesinin birkaç saatten fazla kullanılmasını beklemiyorum).

DateTime start = DateTime.Now; 
DateTime end = DateTime.Now.AddMinutes(135); 
TimeSpan duration = (end - start); 

// output duration as XX hours, YY minutes 

sayesinde
Zack

dip not:

(örnek olarak) aşağıdaki kodu ki Ayrıca "PrettyTime.NET" ile karşılaştım, ama "3 gün önce" gibi şeyler çıktı, vb. Yukarıdaki örneklerde olduğu gibi zaman süresi dizelerini biçimlendirmek için google'da bulduğum diğer her konu beni Java tabanlı bir çözüme götürüyor. : \


GÜNCELLEME 2014/09/08:

takip etmek 3 yıl sonra, ben Nuget ve Github müthiş bir kütüphane buldum denilen bu sorunu çözecek "Humanizer" Ben yaşıyordum. Onu fazla kullanmadım ama denedim ve güzel çalışıyor. Oldukça büyük bir kütüphane olsa da (farklı kültürler için bir çok klasörleri projenizin yapım yoluna yayar (özelleştirmenin bir yolu olduğuna eminim)).

+0

Mesaj Java versiyonlarına bağlantı ... C# yapılabilir olmalıdır :) – MattC

+0

@MattC: Bu bana birkaç dakika sürecek. Onları zaten kapattım. :/ – Zack

+0

@MattC: eh. İşte benzer, ancak farklı bir format. Yine de aynı şekilde. http://stackoverflow.com/questions/3471397/pretty-print-duration-in-java – Zack

cevap

29
Eğer pluralization veriyorsan

Ve:

public static string ToPrettyFormat(this TimeSpan span) { 

    if (span == TimeSpan.Zero) return "0 minutes"; 

    var sb = new StringBuilder(); 
    if (span.Days > 0) 
     sb.AppendFormat("{0} day{1} ", span.Days, span.Days > 1 ? "s" : String.Empty); 
    if (span.Hours > 0) 
     sb.AppendFormat("{0} hour{1} ", span.Hours, span.Hours > 1 ? "s" : String.Empty); 
    if (span.Minutes > 0) 
     sb.AppendFormat("{0} minute{1} ", span.Minutes, span.Minutes > 1 ? "s" : String.Empty); 
    return sb.ToString(); 

} 
+0

Ahhh. Güzel görünüyor. +1 Burada bir cevap gönderen herkese teşekkürler. ;) – Zack

+0

Bu, izleyen alanı kesecek: sb.Remove (sb.Length - 1, 1); – solublefish

+0

Bunu düşünen herkes için yukarıdaki kodda bir hata var. Süre sıfır saniyeden büyük ancak 1 dakikadan daha az ise, 'TimeSpan.Zero' kontrolünden geçilir ancak boş bir dizge döner. Sb’yi döndürmeden önce span.Seconds değerini değerlendirmeniz gerekiyor. –

9

Bunu Google doğrudan sadece çıkışı:

Eğer "kısa" defa ele olacak ve bu daha temiz olmasını istiyorsanız
string result = string.Format("{0} days, {1} hours, {2} minutes", duration.Days, duration.Hours, duration.Minutes); 

, gibi bir şey yapabileceğini:

public string PrettyFormatTimeSpan(TimeSpan span) 
{ 
    if (span.Days > 0) 
     return string.Format("{0} days, {1} hours, {2} minutes", span.Days, span.Hours, span.Minutes); 
    if (span.Hours > 0) 
     return string.Format("{0} hours, {1} minutes", span.Hours, span.Minutes); 

    return string.Format("{0} minutes", span.Minutes); 
} 
+3

+1 yapabilseydim ... SO, bu cevaba zaten oy verdiğimi söylüyor ...:/ – Zack

+0

Hatta derleme bile yapmıyor. Süreyi span ile değiştirin. – Henrik