2010-08-01 16 views
7

के साथ "समय से" उत्पन्न करने का एक शानदार तरीका है मेरे पास यह कोड अतीत में समय लेने और पढ़ने के लिए एक पठनीय स्ट्रिंग उत्पन्न करने के लिए है जो यह कितना समय पहले था। सोचा Timespan.Hoursडेटटाइम ऑब्जेक्ट्स

  1. मैं होता आप घंटे देना होगा, भले ही अतीत में अपने कई Daye लेकिन ऐसा लगता है कि यह टूट जाती है अपनी अलग घटकों (दिन, महीने, आदि) में। मैं कुल घंटे पहले कैसे प्राप्त होगा (भले ही उसके 1 दिन से अधिक?

  2. वहाँ किसी भी क्लीनर तरीके के रूप में यह बहुत spagetti-ish लगता है नीचे दिए गए कोड के इस प्रकार लिखने के लिए यहाँ है।

है कोड

 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

एक भाषा – TheLQ

+0

मदद कर सकती है सी # दिखाई देती है। –

+0

@ लॉर्ड.Quackstar - अद्यतन टैग और प्रश्न – leora

उत्तर

13

समयावधि वस्तु में TotalHours संपत्ति या अन्य Total[TimeUnit] गुणों का उपयोग करें।

1:10 के समयावधि के लिए (एचएच: मिमी), यह 1 Hours और 10 Minutes या 1.167 TotalHours और 70 TotalMinutes के बराबर है।

इसे साफ करने के लिए, यदि आप पहले/जैसी शाखाओं का उपयोग करने के लिए चिपके रहते हैं। स्विच/केस इन शर्तों के साथ केवल विशिष्ट मानों के लिए आपकी सहायता नहीं करेगा। इस तरह कुछ:

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

एम - धन्यवाद।दूसरे प्रश्न पर कोई विचार या ऊपर यह है मूल रूप से समाधान – leora

1

एक विकल्प के रूप में, मेरे पास एक समाधान है जो सप्ताहों, महीनों और वर्षों के साथ दिन के बाहर करता है। दृष्टिकोण थोड़ा अलग है यह अतीत से भविष्य में आगे बढ़ता है, पहले बड़े कदमों की कोशिश करता है और यदि यह अगले छोटे से स्विच करने पर ओवरहूट करता है।

PeriodOfTimeOutput.cs

0

मैं जानता हूँ कि यह एक पुरानी पोस्ट है, लेकिन मैं इस विषय के लिए खोज और पढ़ने जेफ Mercado के जवाब

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; 
} 

ऐसे

var tspan = DateTime.Now.Subtract(reqDate); 
string how_long_ago = PeriodOfTimeOutput(tspan); 
के रूप में इस्तेमाल के बाद प्रत्यावर्तन का उपयोग कर इस समाधान के साथ आया था
1

बहुत देर से उत्तर दिया, लेकिन मुझे इसकी आवश्यकता महसूस हुई, और सामान्य जेएस शर्तों जैसे "सी # पलज डैटटाइम" या "सी # टाइमगो" के परिणाम खोजे जो परिणाम दिखाते हैं सभी सहायक नहीं थे - मैं हार्डकोडेड जादू संख्याओं के साथ अतिरिक्त कोड बनाए रखना नहीं चाहता हूं और जो स्थानीयकरण-अनुकूल नहीं होगा। तो, अंत में, एक और टिप्पणी में से एक में तो जवाब, मैं पुस्तकालय पाया:

Humanizer नेट के लिए - https://github.com/Humanizr/Humanizer#humanize-datetime

उपयोग:

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

और यह भी स्थानीयकृत किए जाने योग्य है!

+0

बिल्कुल सही उत्तर है। –

संबंधित मुद्दे