这可能会有所帮助:
string[] formats = {
"d' Days 'h' Hours 'm' Minutes 's' Seconds'",
"h' Hours 'm' Minutes 's' Seconds'",
"m' Minutes 's' Seconds'",
"s' Seconds'",
"d' Days 'h' Hours 'm' Minutes'",
"d' Days 'h' Hours 's' Seconds'",
"d' Days 'm' Minutes 's' Seconds'",
"h' Hours 'm' Minutes'",
"h' Hours 's' Seconds'",
};
var result = TimeSpan.ParseExact(yourString, formats, CultureInfo.CurrentCulture);
TryParseExact
如果您担心yourString
有时可能是非法的,还有。有关详细信息,请参阅自定义 TimeSpan 格式字符串。
编辑: Asker 澄清说他确实想要“格式化”,而不是“解析”,所以我的回答可能不相关。不知道这个答案还有什么问题。
现在,这是一个(未经测试的)解决方案。零部分被删除,不仅在最重要的部分为零时,而且在“中间”( 01:00:01
) 中的零部分也是如此。语法(复数和单数)应该没问题。中间和末端的空格应该是正确的。放入static
类(扩展方法):
public static string ToMyString(this TimeSpan ts)
{
if (ts < TimeSpan.Zero)
throw new ArgumentOutOfRangeException();
var parts = new List<string>();
AddPart(parts, ts.Days, "Day");
AddPart(parts, ts.Hours, "Hour");
AddPart(parts, ts.Minutes, "Minute");
AddPart(parts, ts.Seconds, "Second");
if (parts.Count == 0)
return "0";
return string.Join(" ", parts);
}
static void AddPart(List<string> parts, int number, string name)
{
if (number == 1)
parts.Add("1 " + name);
else if (number > 1)
parts.Add(string.Format("{0} {1}s", number, name));
}