abc
abc

Reputation: 75

Time elapsed between two dates

I want to find the exact time elapsed between two dates with a condition that if any value is "0" its measurement units should disappear. for example if hours and minutes are o than the elapsed time should come like 1 day 40 seconds not like 1 day 0 hours 0 minutes 40 seconds.

TimeSpan elapsed = completdDate.Subtract(insertdDate);

int daysEl= elapsed.Days;
int hrsEl= elapsed.Hours;
int minsEl = elapsed.Minutes;
int secEl = elapsed.Seconds;

string totalTime = string.Empty;
string days = string.Empty;
string hours = string.Empty;
string mins = string.Empty;
string secs = string.Empty;

if (daysEl == 0 )
    days = days.Replace(daysEl.ToString() , "");
else
  days = daysEl.ToString();

if (hrsEl==0)
    hours = hours.Replace(hrsEl.ToString() , "");
else 
    hours = hrsEl.ToString();

if (minsEl == 0)
    mins = mins.Replace(minsEl.ToString(), "");
else
    mins = minsEl.ToString();

if (secEl == 0)
    secs = secs.Replace(secEl.ToString(), "");
else 
    secs = secEl.ToString();

totalTime = days  + "days" 
          + hours + "hours" 
          + mins  + "minutes" 
          + secs  + "seconds";

********************************Output*****************************

Output Image If any value is zero its unit should disappear

Upvotes: 0

Views: 474

Answers (3)

Aaron Anodide
Aaron Anodide

Reputation: 17186

void Main()
{
    TimeSpan elapsed = DateTime.Now - DateTime.Now.AddDays(-1);

    int daysEl= elapsed.Days;
    int hrsEl= elapsed.Hours;
    int minsEl = elapsed.Minutes;
    int secEl = elapsed.Seconds;

    var sb = new StringBuilder();

    if (daysEl != 0 )
        sb.Append(daysEl + " days ");
    if (hrsEl != 0)
        sb.Append(hrsEl + " hours ");
    if (minsEl != 0)
        sb.Append(minsEl + " mins ");   
    if (secEl != 0)
        sb.Append(secEl + " secs ");

    string totalTime = sb.ToString();

    Console.WriteLine (totalTime);
}

Upvotes: 0

D Stanley
D Stanley

Reputation: 152521

You can get rid of the intermediate strings and if statements:

totalTime = 
    (daysEl  == 0 ? "" : (daysEl  + " days "))
  + (hoursEl == 0 ? "" : (hoursEl + " hours "))
  + (minsEl  == 0 ? "" : (minsEl  + " minutes "))
  + (secsEl  == 0 ? "" : (secsEl  + " seconds "));

Upvotes: 2

David
David

Reputation: 10708

If you want to omit zero values, you're more likely looking at a formatting issue, not a calculation one, and it might be easier to use a StringBuilder.

var sb = new StringBuilder();

if (elapsed.Days != 0)
    sb.AppendFormat("{0} days ", elapsed.Days);
if (elapsed.Hours != 0)
    sb.AppendFormat("{0} hours ", elapsed.Hours);
if (elapsed.Minutes != 0)
    sb.AppendFormat("{0} minutes ", elapsed.Minutes);
if (elapsed.Seconds != 0)
    sb.AppendFormat("{0} seconds ", elapsed.Seconds);

if (sb.Length == 0)
    return "instant!";

// get rid of the last space in there!
return sb.ToString().Substring(0,sb.Length-1); 

By using a format, you're able to more succinctly bind the value with the units (ie "14 seconds") and thus put the whole portion into an if statement, bypassing the section entirely if it's zero.

Upvotes: 1

Related Questions