给定TimeSpan
值的格式字符串和格式化值中的位置(= part),如何增加值?
换句话说,它可以描述为以下功能存根:
TimeSpan IncrementTimeSpan(TimeSpan value, string format, int positionInValueString)
{
Debug.Assert(positionInValueString >= 0
&& positionInValueString < value.ToString(format).Length);
//in: 01:00:00 hh:mm:ss pos: 7
//out: 01:00:01
//in: 01 days 10:30 dd days hh:mm pos: 1
//out: 02 days 10:30
TimeSpan unitToIncrement = FindTheUnitAtPos(value.ToString(format), positionInValueString);
return value.Add(unitToIncrement);
}
positionInValueString
是value.ToString(format)
字符串中的位置,该位置保证是有效的一个位置(即0到value.ToString(format).Length-1
之间)。
format
在编译时是未知的,但是可以保证它是有效的,如果位置不对应于值字符串中的任何单位值,则可以递增最近的一个。不必处理12小时格式。
答案 0 :(得分:0)
如果您以如下格式查看字符串中的占位符,它将起作用:
public static void Main()
{
var ts = new TimeSpan(1, 0, 0);
var format = "hh:mm:ss";
var unitToIncrement = FindTheUnitAtPos(format, 7);
Console.WriteLine("original : {0}", ts);
Console.WriteLine("increment : {0}", unitToIncrement);
Console.WriteLine("result : {0}", ts.Add(unitToIncrement));
Console.WriteLine();
ts = new TimeSpan(1, 10, 30, 0);
format = "dd days hh:mm";
unitToIncrement = FindTheUnitAtPos(format, 1);
Console.WriteLine("original : {0}", ts);
Console.WriteLine("increment : {0}", unitToIncrement);
Console.WriteLine("result : {0}", ts.Add(unitToIncrement));
}
private static TimeSpan FindTheUnitAtPos(string format, int pos)
{
char c = format[pos];
switch (c)
{
case 's': return new TimeSpan(0, 0, 1);
case 'm': return new TimeSpan(0, 1, 0);
case 'h': return new TimeSpan(1, 0, 0);
case 'd': return new TimeSpan(1, 0, 0, 0);
}
return new TimeSpan(0, 0, 0);
}