Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

display timespan nicely

Excuse the rough code, I'm trying to display the duration of videos given the time in seconds. I've had a go below but it's not working properly.

I want it to just display nicely - i.e should display 9m:59s not 09m:59s.

If hours are zero dont display hours, if minutes are zero dont display minutes.

public static string GetTimeSpan(int secs)
{
    TimeSpan t = TimeSpan.FromSeconds(secs);

    string answer;
    if (secs < 60)
    {
        answer = string.Format("{0:D2}s", t.Seconds);
    }
    else if (secs < 600)//tenmins
    {
        answer = string.Format("{0:m}m:{1:D2}s", t.Minutes, t.Seconds);

    }
    else if (secs < 3600)//hour
    {
        answer = string.Format("{0:mm}m:{1:D2}s", t.Minutes, t.Seconds);
    }
    else
    {
        answer = string.Format("{0:h}h:{1:D2}m:{2:D2}s",
                                    t.Hours,
                                    t.Minutes,
                                    t.Seconds);
    }

    return answer;
}
like image 501
raklos Avatar asked Feb 15 '12 10:02

raklos


People also ask

What is the format of a TimeSpan?

"c" is the default TimeSpan format string; the TimeSpan. ToString() method formats a time interval value by using the "c" format string. TimeSpan also supports the "t" and "T" standard format strings, which are identical in behavior to the "c" standard format string.

How do you declare a TimeSpan?

The following example initializes a TimeSpan value to a specified number of hours, minutes, and seconds. TimeSpan interval = new TimeSpan(2, 14, 18); Console. WriteLine(interval. ToString()); // Displays "02:14:18".

What is TimeSpan type in C#?

C# TimeSpan struct represents a time interval that is difference between two times measured in number of days, hours, minutes, and seconds. C# TimeSpan is used to compare two C# DateTime objects to find the difference between two dates.


3 Answers

Something like:

public static string PrintTimeSpan(int secs)
{
   TimeSpan t = TimeSpan.FromSeconds(secs);
   string answer;
   if (t.TotalMinutes < 1.0)
   {
     answer = String.Format("{0}s", t.Seconds);
   }
   else if (t.TotalHours < 1.0)
   {
     answer = String.Format("{0}m:{1:D2}s", t.Minutes, t.Seconds);
   }
   else // more than 1 hour
   {
     answer = String.Format("{0}h:{1:D2}m:{2:D2}s", (int)t.TotalHours, t.Minutes, t.Seconds);
   }

   return answer;
}
like image 176
Hans Kesting Avatar answered Oct 12 '22 09:10

Hans Kesting


I think you can simplify this by removing the "D2" aspect of the format and then you won't need a special case for the under ten minutes option. Basically just using

string.Format("{0}m:{1}s", t.Minutes, t.Seconds);

will get you one or two digits as required. So your final case is:

string.Format("{0}h:{1}m:{2}s", t.Hours, t.Minutes, t.Seconds);
like image 3
kaj Avatar answered Oct 12 '22 10:10

kaj


readonly static Char[] _colon_zero = { ':', '0' };
// ...

var ts = new TimeSpan(DateTime.Now.Ticks);
String s = ts.ToString("h\\:mm\\:ss\\.ffff").TrimStart(_colon_zero);
.0321
6.0159
19.4833
8:22.0010
1:04:2394
19:54:03.4883
like image 3
Glenn Slayden Avatar answered Oct 12 '22 09:10

Glenn Slayden