Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Remove leading zeros from time to show elapsed time

I need to display simplest version of elapsed time span. Is there any ready thing to do that?

Samples:

HH:mm:ss
10:43:27 > 10h43m27s
00:04:12 > 4m12s
00:00:07 > 7s

I think I need a format provider for elapsed time.

like image 807
Nime Cloud Avatar asked Mar 22 '11 21:03

Nime Cloud


4 Answers

You can use string.Format to achieve this, along with some conditional statements:

public static string GetSimplestTimeSpan(TimeSpan timeSpan)
{
    var result = string.Empty;
    if (timeSpan.Days > 0)
    {
        result += string.Format(
            @"{0:ddd\d}", timeSpan).TrimStart('0');
    }
    if (timeSpan.Hours > 0)
    {
        result += string.Format(
            @"{0:hh\h}", timeSpan).TrimStart('0');
    }
    if (timeSpan.Minutes > 0)
    {
        result += string.Format(
            @"{0:mm\m}", timeSpan).TrimStart('0');
    }
    if (timeSpan.Seconds > 0)
    {
        result += string.Format(
            @"{0:ss\s}", timeSpan).TrimStart('0');
    }
    return result;
}

Though, seeing the answer by BrokenGlass I'm tempted to say using Format here at all is overkill. However, it does allow you to tweak the output of each element of the elapsed time span if required.

like image 142
Grant Thomas Avatar answered Oct 13 '22 21:10

Grant Thomas


Simple extension method should be enough:

static class Extensions
{ 
    public static string ToShortForm(this TimeSpan t)
    {
        string shortForm = "";
        if (t.Hours > 0)
        {
            shortForm += string.Format("{0}h", t.Hours.ToString());
        }
        if (t.Minutes > 0)
        {
            shortForm += string.Format("{0}m", t.Minutes.ToString());
        }
        if (t.Seconds > 0)
        {
            shortForm += string.Format("{0}s", t.Seconds.ToString());
        }
        return shortForm;
    } 
} 

Test it with:

TimeSpan tsTest = new TimeSpan(10, 43, 27);
string output = tsTest.ToShortForm();
tsTest = new TimeSpan(0, 4, 12);
output = tsTest.ToShortForm();
tsTest = new TimeSpan(0, 0, 7);
output = tsTest.ToShortForm();
like image 25
Kelsey Avatar answered Oct 13 '22 23:10

Kelsey


Here's a one-liner (almost), assuming you have the TimeSpan objectL

(new TimeSpan(0, 0, 30, 21, 3))
  .ToString(@"d\d\ hh\hmm\mss\s")
  .TrimStart(' ','d','h','m','s','0');

The sample code outputs

30m21s

The first line just makes a TimeSpan object for the sake of an example, .ToString formats it in the format you're asking for and then .TrimStart removes the leading characters you don't need.

like image 17
Sten Petrov Avatar answered Oct 13 '22 23:10

Sten Petrov


I don't think this can be done in a straightforward way doing a custom format serializer - I'd just roll my own:

TimeSpan delta = TimeSpan.Parse("09:03:07");
string displayTime = string.Empty;
if (delta.Hours > 0)
    displayTime += delta.Hours.ToString() + "h";

if (delta.Minutes > 0)
    displayTime += delta.Minutes.ToString() + "m";

if (delta.Seconds > 0)
    displayTime += delta.Seconds.ToString() + "s";

Note that this would only work for positive time spans.

like image 3
BrokenGlass Avatar answered Oct 13 '22 23:10

BrokenGlass