如何以具有区域性意识的方式格式化TimeSpan的HH:mm:ss分隔符



我正在开发一款应用程序,该应用程序可能在世界上许多国家都可以看到。没有多少国家/地区用除以下内容之外的其他内容显示小时、分钟和秒:作为分隔符,但也有一些国家/地区,我想确保时间的格式正确。DateTime在这方面做得很好,但TimeSpan不是。这些片段来自我在Visual Studio 2010中使用.Net 4的直接窗口,我所在的地区设置为马拉雅拉姆语(印度)。dateTime.Now调用还反映了时间在我的时钟、MicrosoftOutlook和其他区域的显示方式。

DateTime.Now.ToString()
"02-10-12 17.00.58"

http://msdn.microsoft.com/en-us/library/dd784379.aspx表示"如果formatProvider为null,则使用与当前区域性关联的DateTimeFormatInfo对象。如果format是自定义格式字符串,则忽略formatProvider参数。"因此,我甚至不需要传入CurrentCultureInfo。我在这里想要的格式是hh.mm.ss,但在大多数其他语言中,很明显是hh:mm:ss,如果还有其他不好的地方,它也应该自动反映这些-基本上TimeSpan应该是文化性感知的,就像DateTime一样。

但是:

timeRemaining.ToString()
"00:02:09"
timeRemaining.ToString("c")
"00:02:09"
timeRemaining.ToString("c", CultureInfo.CurrentCulture)
"00:02:09"
timeRemaining.ToString("g")
"0:02:09"
timeRemaining.ToString("G")
"0:00:02:09.0000000"
timeRemaining.ToString("t")
"00:02:09"
timeRemaining.ToString("g", CultureInfo.CurrentCulture)
"0:02:09"
timeRemaining.ToString("g", CultureInfo.CurrentUICulture)
"0:02:09"
timeRemaining.ToString("G", CultureInfo.CurrentUICulture)
"0:00:02:09.0000000"
timeRemaining.ToString("G", CultureInfo.CurrentCulture)
"0:00:02:09.0000000"
timeRemaining.ToString("t", CultureInfo.CurrentCulture)
"00:02:09"

我正在寻找一个简单的单行,以文化感知的方式输出时间跨度。欢迎提出任何想法。

看起来像是一个错误,您可以在connect.microsoft.com上报告它。同时,一个解决方法是利用DateTime格式。像这样:

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();
}
}

输出:

00.02.09

这更像是一个注释,但需要一些空间,所以我将其作为答案编写。

虽然DateTime的字符串格式在.NET中已经存在很长时间了,但TimeSpan的格式在.NET 4.0(Visual Studio 2010)中是新出现的。

区域性有一个由DateTime使用的DateTimeFormatInfo对象,该对象包括有关是使用冒号:还是使用句点.或其他介于小时、分钟和秒之间的信息。现在,TimeSpan似乎没有使用这个DateTimeFormatInfo对象,也没有所谓的"TimeSpanFormatInfo"。

这里有一个例子:

// 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"

我正在寻找一个简单的单行,以文化感知的方式输出timeSpan。

那么我认为您最好使用DateTime类为您进行格式化:

string display = new DateTime(timespan.Ticks).ToLongTimeString();

假设CCD_ 10保持0到24小时之间的正持续时间。

最新更新