преобразовать строковое представление промежутка времени в объект промежутка времени

У меня есть такие строки, например: '1 час' 5 минут '1 день' 30 секунд '4 часа'

эти строки представляют время, прошедшее с чего-то. Я хочу преобразовать их во время (DateTime), которое происходит

Я попытался вставить его в timespan.parse, но он вызвал исключение ...

Как лучше всего сделать что-то подобное?

Спасибо


person Jay Arbiv    schedule 27.01.2014    source источник
comment
Покажите нам свой код и полученное исключение.   -  person Rik    schedule 27.01.2014
comment
вы можете разделить каждую строку пробелом и представить ее как строку str = 1: 05: 30:, а затем проанализировать ее.   -  person Shashank    schedule 27.01.2014
comment
Думаю, я неправильно объяснил себя, каждая из этих строк сама по себе. Они не связаны друг с другом. У меня может быть такая строка: '5 мин', и я хочу преобразовать ее во временной интервал   -  person Jay Arbiv    schedule 27.01.2014
comment
Вы можете разделить строку и использовать словарь для всех имен (час, часы, минуты, минуты и т. Д.)   -  person Dmitry Bychenko    schedule 27.01.2014


Ответы (3)


Вы можете попробовать использовать Dictionary для всех используемых имен:

public static TimeSpan ParseTimeSpan(String value) {
  // Expand dictionary with values you're using, e.g. 
  // "second", "minute", "week" etc.
  Dictionary<String, long> seconds = new Dictionary<String, long>() {
    {"days", 86400},
    {"day", 86400},
    {"hours", 3600},
    {"hour", 3600},
    {"mins", 60},
    {"min", 60},
    {"secs", 1},
    {"sec", 1}
  };

  String[] items = value.Split();

  long result = 0;

  for (int i = 0; i < items.Length - 1; i += 2)
    result += long.Parse(items[i]) * seconds[items[i + 1]];

  return TimeSpan.FromSeconds(result);
}

... 

TimeSpan result = ParseTimeSpan("1 hour 15 mins 32 secs");
person Dmitry Bychenko    schedule 27.01.2014
comment
после этого мой ответ кажется таким упрощенным ... = ( - person Sinatr; 27.01.2014

Вторая часть строки - единицы.

Не знаю, какой формат у вас будет, но все эти списки можно разделить и проанализировать следующим образом:

// text is "1 hour" or "5 mins" or "1 day" or "30 secs" or "4 hours"
var item = text.Split(new char[] {' '});
var value = int.Parse(item[0]);
var unit = item[1];
// get lowest units, in our case it is seconds
if(unit.StartWith("min"))
    value *= 60;
else
    if(unit.StartWith("hour"))
        value *= 60 * 60;
    else
        if(unit.StartWith("day"))
            value *= 60 * 60 * 24;
// now that we have seconds, we can convert it into timespan
var timespan = new TimeSpan(0, 0, value);

Вы можете сделать это за мс или даже за тики.

person Sinatr    schedule 27.01.2014

Используйте строку типа «1: 5» с TimeSpan. TryParse

person Johnny    schedule 27.01.2014
comment
Что-то не так с этим ответом? Поправьте меня или объясните, как происходит голосование. - person Johnny; 27.01.2014
comment
Я хочу как-то преобразовать строки, подобные примерам, в интервал времени ... Что такое 1: 5, которое вы написали? Кстати, я не голосовал. - person Jay Arbiv; 27.01.2014
comment
Они должны добавить возможность видеть имена тех, кто проголосовал против (очевидно, чтобы проголосовать против них по очереди!). Возможно, ваш ответ не решает ни одного случая вопроса OP (пока есть проголосованный комментарий, который отсутствует в вашей части ответа представлять). / пожимать плечами - person Sinatr; 27.01.2014
comment
Джей, ты проверял ссылку MSDN, которую я прикрепил? Там есть примеры. - person Johnny; 27.01.2014