【问题标题】:Different behaviour between formatting strings for TimeSpan and DateTimeTimeSpan 和 DateTime 的格式化字符串之间的不同行为
【发布时间】:2010-08-03 11:21:11
【问题描述】:

今天在编码时,我注意到时间跨度和格式化字符串有些奇怪。我试图打印一个时间跨度,例如 01:03:371: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();
    }
}

输出:

01:03:37
01:03:37  // <-- expected: 1:03:37
01:03:37
1:03:37
01:03:37

为什么 TimeSpan 和 DateTime 的行为不同?

【问题讨论】:

  • 提示,您可以使用Console.WriteLine("{0:h:mm:ss}", time,) 代替,因为您已经设置了当前的文化,不需要使用带有文化参数的string.Format
  • 您使用的是什么版本的 .Net?

标签: c# datetime timespan


【解决方案1】:

因为您的格式化字符串不适用于 TimeSpanTimeSpan.ToString() 总是返回 (from MSDN):

代表值的字符串 这个实例。返回值为 形式:

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

【讨论】:

    【解决方案2】:

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

    在 .Net 4.0 中,格式字符串为documented

    【讨论】:

      【解决方案3】:

      【讨论】:

      • 谢谢...错过了文档中的“h”信息(从答案中删除)。
      猜你喜欢
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-27
      • 2023-04-09
      • 1970-01-01
      • 2014-11-30
      相关资源
      最近更新 更多