TimeSpan和DateTime的格式化字符串之间的不同行为

Jon*_*oln 1 c# datetime timespan

在今天进行编码时,我注意到时间跨度和格式化字符串有些奇怪.我试图打印时间跨度,例如01:03:37作为1:03:37(不数小时的前导0).所以我使用了格式字符串h:mm:ss.然而,这给了我一个前导0.如果我将TimeSpan转换为DateTime并再次做同样的事情,h格式化字符串按预期工作.

一个示例控制台程序:

class Program
{
    static void Main(string[] args)
    {
        var time = new TimeSpan(01, 03, 37);

        var culture = new CultureInfo("sv-SE");

        Thread.CurrentThread.CurrentCulture = culture;
        Thread.CurrentThread.CurrentUICulture = culture;

        Console.WriteLine(time.ToString());

        Console.WriteLine(string.Format(culture, "{0:h:mm:ss}", time));
        Console.WriteLine(string.Format(culture, "{0:hh:mm:ss}", time));

        Console.WriteLine((new DateTime(time.Ticks)).ToString("h:mm:ss", culture));
        Console.WriteLine((new DateTime(time.Ticks)).ToString("hh:mm:ss", culture));

        Console.ReadKey();
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

01:03:37
01:03:37  // <-- expected: 1:03:37
01:03:37
1:03:37
01:03:37
Run Code Online (Sandbox Code Playgroud)

为什么TimeSpan和DateTime的表现不同?

Den*_*sky 7

因为您的格式字符串不起作用TimeSpan并且TimeSpan.ToString()始终返回(来自MSDN):

一个字符串,表示此实例的值.返回值的形式如下:

[ - ] [d]为hh:mm:ss的[.ff]


SLa*_*aks 6

在.Net 4.0之前,TimeSpans不支持格式字符串.

在.NET 4.0中,格式字符串被记录在案.