I\'m working on an app that may be seen in many countries in the world. There are not many countries that show hours, minutes and seconds with something other than : as a s
I'm looking for a simple, single line to output a timeSpan in a culture-Aware manner.
Then I think you're best off using the DateTime
class to do the formatting for you:
string display = new DateTime(timespan.Ticks).ToLongTimeString();
Assuming that timespan
holds a positive duration between 0 and 24 hours long.
This is more like a comment, but needs some space, so I write it as an answer.
While string formatting of DateTime
has been in .NET for a very long time, formatting of TimeSpan
was new in .NET 4.0 (Visual Studio 2010).
A culture has a DateTimeFormatInfo
object which is used by DateTime
and includes info on whether to use colon :
or period .
or something else between hours, minutes and seconds. Now, TimeSpan
does not seem to use this DateTimeFormatInfo
object, and there is nothing called "TimeSpanFormatInfo".
Here's an example:
// we start from a non-read-only invariant culture
Thread.CurrentThread.CurrentCulture = new CultureInfo("");
// change time separator of DateTime format info of the culture
CultureInfo.CurrentCulture.DateTimeFormat.TimeSeparator = "<-->";
var dt = new DateTime(2013, 7, 8, 13, 14, 15);
Console.WriteLine(dt); // writes "07/08/2013 13<-->14<-->15"
var ts = new TimeSpan(13, 14, 15);
Console.WriteLine(ts); // writes "13:14:15"
Looks like a bug, you can report it at connect.microsoft.com. Meanwhile, a workaround is to take advantage of DateTime formatting. Like this:
using System;
using System.Globalization;
class Program {
static void Main(string[] args) {
var ci = CultureInfo.GetCultureInfo("ml-IN");
System.Threading.Thread.CurrentThread.CurrentCulture = ci;
var ts = new TimeSpan(0, 2, 9);
var dt = new DateTime(Math.Abs(ts.Ticks));
Console.WriteLine(dt.ToString("HH:mm:ss"));
Console.ReadLine();
}
}
Output:
00.02.09