9

我有一个时间跨度,需要以特定格式输出,如下所示:-

TimeSpan TimeDifference = DateTime.Now - RandomDate;

我正在像这样格式化 TimeSpan:-

string result = string.Format(@"{0:hh\:mm\:ss}", TimeDifference);

结果将如下所示:-

“00:16:45.6184635”

如何将这些秒数舍入到小数点后 0 位?

Expected Result = 00:16:46

谢谢

4

3 回答 3

11

您的代码适用于 .NET 4 但不适用于 3.5,因为 4 发生了重大变化,TimeSpan现在实现IFormattable(见下文)。

您可以在 3.5 或更低版本上执行的操作是将其转换TimeSpanDateTime并使用ToString

DateTime dtime = DateTime.MinValue.Add(TimeDifference);
string result = dtime.ToString(@"hh\:mm\:ss");

在这里你可以看到非工作+工作版本:http: //ideone.com/Ak1HuD


编辑我认为它有时工作有时不工作的原因是因为 .NET 4.0 TimeSpan实现IFormattable似乎被String.Format.

于 2013-01-31T09:20:27.357 回答
7

您的代码应该可以正常工作(在删除小的语法错误之后)。考虑以下示例:

TimeSpan TimeDifference = DateTime.Now - DateTime.Now.AddHours(-6);
string result = string.Format(@"{0:hh\:mm\:ss}", TimeDifference);
Console.WriteLine("TimeSpan: {0}", TimeDifference.ToString());
Console.WriteLine("Formatted TimeSpan: {0}", result);

输出:

TimeSpan: 05:59:59.9990235
Formatted TimeSpan: 05:59:59
于 2013-01-31T09:16:45.777 回答
5

对我来说很好。

例如,这个程序:

using System;

namespace Demo
{
    public static class Program
    {
        private static void Main(string[] args)
        {
            DateTime then = new DateTime(2013, 1, 30, 0, 1, 3);
            TimeSpan ts = DateTime.Now - then;

            Console.WriteLine(ts.ToString());
            Console.WriteLine(ts.ToString(@"hh\:mm\:ss"));
            Console.WriteLine(string.Format(@"{0:hh\:mm\:ss}", ts));

            // Or, with rounding:
            TimeSpan rounded = TimeSpan.FromSeconds((int)(0.5 + ts.TotalSeconds));
            Console.WriteLine(rounded.ToString(@"hh\:mm\:ss"));
        }
    }
}

输出类似:

1.09:20:22.5070754
09:20:22
09:20:22
09:20:23 <- Note rounded up to :23
于 2013-01-31T09:18:48.737 回答