2010-08-01 28 views
7

ile "zamandan beri" üretmek için daha akıllı bir yol var, bu kodu geçmişte bir süre almak ve ne kadar önce olduğunu göstermek için okunabilir bir dize oluşturmak için var.bir DateTime nesnesi

  1. ben olurdu düşünce Timespan.Hours saatlerce verecek olsa bile onun çoklu geçmişte daye ama onun ayrı bileşenlerinin (gün, ay, vb) içine ayırır gibi görünüyor. i toplam saat önce alacağı Nasıl (bile fazla 1 gün?

  2. oldukça spagetti imsi göründüğü gibi aşağıdaki kodu bu tip yazmak için herhangi temizleyici bir yolu var mı.

İşte onun kod

 DateTime when = GetDateTimeinPast(); 
     TimeSpan ts = DateTime.Now.Subtract(when); 

     switch (ts.Days) 
     { 
      case 0: 
       if (ts.Hours < 1) 
        b.Append(ts.Minutes + " minutes ago"); 
       else 
        b.Append(ts.Hours + " hours ago"); 
       break; 
      case 1: 
       b.Append(" yesterday"); 
       break; 
      case 2: 
      case 3:     
      case 4: 

       b.Append("on " + when.DayOfWeek.ToString()); 
       break; 
      default: 
       b.Append(ts.Days + " days ago"); 
       break; 
     } 
+0

Bir dil yardımcı olabilir – TheLQ

+0

C# olarak görünmektedir. –

+0

@ Lord.Quackstar - güncellenen etiketler ve soru – leora

cevap

13

zaman aralığı nesnesinde TotalHours özelliği veya başka bir Total[TimeUnit] özelliklerini kullanma.

1:10 zaman için (hh: mm), 1 Hours ve 10 Minutes veya 1.167 TotalHours ve 70 TotalMinutes'a eşittir.

Daha sonra yaptığınız gibi/else dallarını kullanarak temizleyiniz. anahtar/durum bu şartlarda size yardımcı olmayacaktır, sadece belirli değerler için. Böyle bir şey: Bir alternatif olarak

DateTime when = GetDateTimeinPast(); 
TimeSpan ts = DateTime.Now.Subtract(when); 
if (ts.TotalHours < 1) 
    b.AppendFormat("{0} minutes ago", (int)ts.TotalMinutes); 
else if (ts.TotalDays < 1) 
    b.AppendFormat("{0} hours ago", (int)ts.TotalHours); 
//etc... 
+0

M - teşekkürler.İkinci soruyla ilgili herhangi bir fikir veya yukarıdakiler bu temelde çözümdür. – leora

1

, ben yapan bir çözümü var o haftalar, aylar ve yıllar günlerin ötesinde. Yaklaşım biraz farklıdır Geçmişten geleceğe doğru ilerler, ilk önce büyük adımları dener ve eğer bir sonraki küçük olana geçiş yaparsa.

PeriodOfTimeOutput.cs

0

Bu eski bir yazı olduğunu biliyorum ama

private string PeriodOfTimeOutput(TimeSpan tspan, int level = 0) 
{ 
    string how_long_ago = "ago"; 
    if (level >= 2) return how_long_ago; 
    if (tspan.Days > 1) 
     how_long_ago = string.Format("{0} Days ago", tspan.Days); 
    else if (tspan.Days == 1) 
     how_long_ago = string.Format("1 Day {0}", PeriodOfTimeOutput(new TimeSpan(tspan.Hours, tspan.Minutes, tspan.Seconds), level + 1)); 
    else if (tspan.Hours >= 1) 
     how_long_ago = string.Format("{0} {1} {2}", tspan.Hours, (tspan.Hours > 1) ? "Hours" : "Hour", PeriodOfTimeOutput(new TimeSpan(0, tspan.Minutes, tspan.Seconds), level + 1)); 
    else if (tspan.Minutes >= 1) 
     how_long_ago = string.Format("{0} {1} {2}", tspan.Minutes, (tspan.Minutes > 1) ? "Minutes" : "Minute", PeriodOfTimeOutput(new TimeSpan(0, 0, tspan.Seconds), level + 1)); 
    else if (tspan.Seconds >= 1) 
     how_long_ago = string.Format("{0} {1} ago", tspan.Seconds, (tspan.Seconds > 1) ? "Seconds" : "Second");   
    return how_long_ago; 
} 

böyle

var tspan = DateTime.Now.Subtract(reqDate); 
string how_long_ago = PeriodOfTimeOutput(tspan); 
olarak kullanılan Jeff Mercado cevabı bu konu için arama ve okuduktan sonra özyineleme kullanarak bu çözüm geldi
1

Çok geç bir cevap, ancak bunun için gerekli olduğunu hissettim ve "C# momentjs datetime" veya "C# timeago" gibi genel JS terimlerini aramak hiç yardımcı olmadı - kodlanmış sihirli numaraları ile ekstra kod korumak istemiyorum ve yerelleştirme dostu olmayacak. https://github.com/Humanizr/Humanizer#humanize-datetime

Kullanımı - NET için

Humanizer:

DateTime.UtcNow.AddHours(-2).Humanize() => "2 hours ago" 

Ve çok localizable var Yani, nihayet, SO cevap diğerinde yorumların birinde, ben kütüphane buldum!

+0

Kesinlikle doğru cevap. –