【问题标题】:TimeSpan String Formatting时间跨度字符串格式
【发布时间】:2013-01-31 09:07:50
【问题描述】:

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

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

谢谢

【问题讨论】:

  • 你能显示预期的结果吗?

标签: c# string .net-3.5 timespan


【解决方案1】:

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

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

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

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


编辑我认为它有时有效有时无效的原因是since .NET 4.0 TimeSpan 实现了IFormattable 其中seem to be used by String.Format。

【讨论】:

  • 谢谢蒂姆,不胜感激。
  • 这很奇怪,我认为问题必须与我从应用程序中的 DateTime.Now 中扣除的 DateTime 相关。正如上面的例子,我的代码确实有效。
  • @Derek:编辑了我的答案,通过将TimeSpan 转换为DateTime 来提供3.5 的方法。这些示例之所以有效,是因为它们只是将整小时相加,那么小数秒就不会出现舍入问题。
  • +1 Tim,很好的解释,TimeSpan.ToString 在 .Net 2.0 中没有字符串格式的重载。
【解决方案2】:

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

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

【讨论】:

  • 我想他可能希望时间四舍五入到06:00:00。
  • 但是看看 ideone:ideone.com/FMye8j 我假设它的框架依赖于 string.Format。
  • @TimSchmelter 你的答案去哪儿了?
  • @Derek:已删除,因为我不确定是什么导致了您的问题以及为什么有时会起作用。
  • @Derek:再次添加。这是从 3.5 到 4.0 的重大变化
【解决方案3】:

对我来说很好。

例如这个程序:

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

【讨论】:

  • 之所以有效,是因为您至少使用 .NET 4 而不是 OP 的 3.5
  • 我认为,我上面示例中的四舍五入应该也可以为 .Net 3.5 修复它。
  • 是的,我想是的。它只是忽略了这样一个事实,即其他一切都不适用于 OP(或任何使用 .NET 版本低于 4 的人)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多