增加格式化的TimeSpan的选定部分

时间:2018-10-30 13:34:43

标签: c# string-formatting timespan

给定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);
}

positionInValueStringvalue.ToString(format)字符串中的位置,该位置保证是有效的一个位置(即0到value.ToString(format).Length-1之间)。
format在编译时是未知的,但是可以保证它是有效的,如果位置不对应于值字符串中的任何单位值,则可以递增最近的一个。不必处理12小时格式。

1 个答案:

答案 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);
}

工作小提琴:https://dotnetfiddle.net/FteLxB