2008-08-25 5 views
29

У меня есть несколько строк xxh: yym, где xx - часы, а yy - минуты, такие как «05h: 30m». Каков элегантный способ преобразования строки этого типа в TimeSpan?Строка parse для TimeSpan

ответ

26

Это похоже на работу, хотя это немного хака:

TimeSpan span; 


if (TimeSpan.TryParse("05h:30m".Replace("m","").Replace("h",""), out span)) 
      MessageBox.Show(span.ToString()); 
+15

Я предложил бы использовать, возможно, `TimeSpan.TryParse («hh'h: „mm'm“», из диапазона)` для более чистого и более надежное решение – mike 2011-01-04 23:54:40

+2

исключением случаев, когда строка 25ч: 30м – 2011-09-14 08:39:03

+1

примечание: это решение ограничено 23h: 59m – fubo 2013-07-26 13:17:58

1

ли TimeSpan.Parse и TimeSpan.TryParse не варианты? Если вы не используете «одобренный» формат, вам нужно будет вручную разобрать. Я бы, вероятно, захватил ваши два целочисленных значения в регулярном выражении, а затем попытался разобрать их в целые числа, оттуда вы можете создать новый TimeSpan со своим конструктором.

6

DateTime.ParseExact или DateTime.TryParseExact позволяет указать точный формат ввода. После того, как вы получите DateTime, вы можете взять DateTime.TimeOfDay, который является TimeSpan.

В отсутствие TimeSpan.TryParseExact, я думаю, что «изящное» решение выходит из состава.

@buyutec Как вы подозревали, этот метод не будет работать, если промежутки времени имеют более 24 часов.

2

Here'e одна возможность:

TimeSpan.Parse(s.Remove(2, 1).Remove(5, 1)); 

И если вы хотите, чтобы сделать его более элегантным в своем коде, используйте метод расширения:

public static TimeSpan ToTimeSpan(this string s) 
{ 
    TimeSpan t = TimeSpan.Parse(s.Remove(2, 1).Remove(5, 1)); 
    return t; 
} 

Затем вы можете сделать

"05h:30m".ToTimeSpan();