Увеличение выбранной части отформатированного TimeSpan - PullRequest
0 голосов
/ 30 октября 2018

Как мне увеличить TimeSpan значение, учитывая его строку формата и позицию (= часть) в отформатированном значении?
Другими словами, это можно описать как следующую заглушку функции:

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-часовые форматы.

1 Ответ

0 голосов
/ 30 октября 2018

Это может работать, если вы посмотрите на заполнители в строке формата, например:

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

...