Custom format string for a .Net 3.5 TimeSpan object
Hmm, turns out TimeSpan only supports custom ToString formatting from .Net 4 onwards....
So here's a noddy extension method. Supports h for hours, m for minutes, s for seconds (along with hh for zero padding, and so on) and passes any other characters through to the output. It's all I needed but could be easily extended.
/// <summary> /// Returns the TimeSpan object as a string using the provided format string. /// Currently supports: /// h - Hours /// m - Minutes /// s - Seconds /// hh - Zero padded hours /// mm - Zero padded minutes /// ss - Zero padded seconds /// </summary> ///<param name="ts">The TimeSpan object</param> ///<param name="formatString">The format string</param> ///<returns>Formatted string representation of the TimeSpan</returns> public static string ToString(this TimeSpan ts, string formatString) { var sb = new StringBuilder(); for (var i = 0; i < formatString.Length; i++) { switch (formatString[i]) { case 'h': if (i < formatString.Length - 1 && formatString[i + 1] == 'h') { if (ts.Hours < 10) sb.AppendFormat("0{0}", ts.Hours); else sb.Append(ts.Hours); i++; } else sb.Append(ts.Hours); break; case 'm': if (i < formatString.Length - 1 && formatString[i + 1] == 'm') { if (ts.Minutes < 10) sb.AppendFormat("0{0}", ts.Minutes); else sb.Append(ts.Minutes); i++; } else sb.Append(ts.Minutes); break; case 's': if (i < formatString.Length - 1 && formatString[i + 1] == 's') { if (ts.Seconds < 10) sb.AppendFormat("0{0}", ts.Seconds); else sb.Append(ts.Seconds); i++; } else sb.Append(ts.Seconds); break; default: // Pass through any non recognised characters sb.Append(formatString[i]); break; } } return sb.ToString(); }