Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Custom string formats of TimeSpan

I want to format TimeSpans in C# in this way:

xxx day(s) yyy hours(s) zzz minute(s)

Conditions:

  1. Extra seconds should be truncated

  2. day(s) is the largest unit I want. I want 34 days to appear as 34 days rather than 1 month 4 days etc.

  3. If timespan is less than one day, I dont want the day part to show up. Likewise if span is less than 1 hour, I want only the mins part to show up.

Is there any way I can do this using built-in format strings or there is no way other than writing my own function?

Edit: Currently using my own function for this. It takes TimeSpan in minutes as input (TimeSpan.TotalMinutes) :

private static string GetTimeStringFromMinutes(double p)
        {
            var minutes = (int) p;
            int hours = minutes / 60;
            minutes = minutes % 60;
            int days = hours/24;
            hours = hours%24;
            string dayPart = days + " day(s) ";
            string hoursPart = hours + " hour(s) ";
            string minutesPart = minutes + " minute(s)";
            if (days != 0)
                return (dayPart + hoursPart + minutesPart);
            if (hours != 0)
                return (hoursPart + minutesPart);
            return (minutesPart);
        }
like image 417
Hari Menon Avatar asked Aug 20 '10 09:08

Hari Menon


2 Answers

TimeSpan has no formatting options at all before .NET 4.0, you'd have to convert it to DateTime through the Ticks property. Nothing remotely close in DateTime.String(format) formatting options though, you'll have to write it yourself.

In .NET 4.0, TimeSpan acquired a ToString(format) override. Custom formatting strings are described here. Your 3rd requirement is going to need code.

like image 92
Hans Passant Avatar answered Oct 11 '22 15:10

Hans Passant


In .NET 3.5 and earlier you need to write your own function.

In .NET 4 support was added for formatting TimeSpan, see TimeSpan.ToString(string) for details.

like image 24
Richard Avatar answered Oct 11 '22 13:10

Richard