TimeSpan ToString "[d.]hh:mm"

12

我想将一个TimeSpan格式化为字符串。 然后我从MSDN中获取到过期时间,以生成自定义的字符串格式。 但是它不起作用。它返回“FormatException”。

为什么?我不明白...

var ts = new TimeSpan(0, 3, 25, 0);
var myString = ts.ToString("[d'.']hh':'mm");
2个回答

15
我猜您想做的类似于 c 标准格式 中的可选日期和分数秒部分。据我所知,使用自定义格式字符串不能直接实现这一点。TimeSpan FormatString with optional hours 是您提出的相同类型的问题,我建议采用类似他们解决方案的扩展方法来构建格式字符串。
public static string ToMyFormat(this TimeSpan ts)
{
    string format = ts.Days >= 1 ? "d'.'hh':'mm" : "hh':'mm";
    return ts.ToString(format);
}

然后使用它:
var myString = ts.ToMyFormat();

是的,它肯定会起作用。但我会使用ToString格式。MSDN说我可以使用“ [”和“]”。这是真的吗? - riofly
1
在哪里说了这个?我注意到 [] 的唯一时候是在描述标准格式字符串的方式,但没有说你可以在自定义格式中实际使用这些“魔法”符号。 - Tim S.
在这个页面上(https://learn.microsoft.com/en-us/dotnet/standard/base-types/standard-timespan-format-strings)的第一个表格中有写。 - Robert Massa

3

这种错误通常会在您在格式化字符串中使用具有定义意义的符号时出现。调试它们的最佳方法是选择性地删除字符,直到它能正常工作。您删除的最后一个字符是问题所在。

在这种情况下,查看自定义TimeSpan格式字符串,方括号是问题所在。通过 "\" 转义它们,例如:

var ts = new TimeSpan(0, 3, 25, 0);
var myString = ts.ToString("\\[d'.'\\]hh':'mm");

[编辑: 添加]

在客户自定义TimeSpan格式字符串页面中,并没有提到如何省略文本,如果值为0的话。在这种情况下,可以考虑使用if语句或者?:运算符。


是的,我知道方括号是问题所在。但我希望能够使用 "[" 和 "]" 只返回值大于等于 0 的天数。这样做可能吗? - riofly
@riofly 在http://msdn.microsoft.com/en-us/library/ee372287.aspx中似乎没有办法在值为0时省略字符串的一部分。也许使用if语句会更好。答案已更新。 - akton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接