10

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

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

http://msdn.microsoft.com/en-us/library/dd784379.aspx说“如果 formatProvider 为 null,则使用与当前区域性关联的 DateTimeFormatInfo 对象。如果 format 是自定义格式字符串,则 formatProvider 参数被忽略。” 按理说,我什至不需要传入当前 CultureInfo。我在这里想要的格式是 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"

我正在寻找一个简单的单行来以文化感知的方式输出 timeSpan。任何想法表示赞赏。

4

3 回答 3

8

看起来像一个错误,您可以在 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();
    }
}

输出:

09.02.09

于 2012-10-02T22:53:23.583 回答
3

这更像是一个评论,但需要一些空间,所以我把它写成一个答案。

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

文化有一个DateTimeFormatInfo对象,该对象由使用DateTime并包含有关是否使用冒号:或句.点或其他小时、分钟和秒之间的其他内容的信息。现在,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"
于 2013-07-08T10:40:02.843 回答
1

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

然后我认为您最好使用该DateTime课程为您进行格式化:

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

假设它timespan的持续时间在 0 到 24 小时之间。

于 2015-01-30T14:07:13.560 回答