2010-03-16 5 views
38

Я пытаюсь отформатировать элемент TimeSpan в формате «[minutes]: [seconds]». В этом формате 2 минуты и 8 секунд будут выглядеть как «02:08». Я пробовал различные варианты с String.Format и ToString методами, но я получаю FormatException. Это то, что я сейчас пытаюсь:C# + Format TimeSpan

DateTime startTime = DateTime.Now; 
// Do Stuff 
TimeSpan duration = DateTime.Now.Subtract(startTime); 

Console.WriteLine("[paragraph of information] Total Duration: " + duration.ToString("mm:ss")); 

Что я делаю неправильно? Как мне отформатировать элемент TimeSpan, используя мой желаемый формат?

Спасибо

+0

Возможный дубликат [Как я могу использовать String.Format объект TimeSpan с пользовательским форматом в .NET?] (Http://stackoverflow.com/questions/574881/how-can-i-string-format-a- timespan-object-with-a-custom-format-in-net) –

ответ

41

Попробуйте это:

Console.WriteLine("{0:D2}:{1:D2}", duration.Minutes, duration.Seconds); 
+0

О, вы отправили, когда я писал свой ответ :) – Joel

+4

Это не совсем так, разделитель времени - это чувствительная к культуре строка, доступная в CultureInfo. DateTimeFormat.TimeSeparator. Или используйте метод DateTime.ToString(). –

+1

@nobugz: Спасибо за ценную информацию. OP явно запросил этот конкретный формат. –

6

Струны формат даты и времени применяются только к DateTime и DateTimeOffset. Yo можно использовать обычную строку формата, хотя:

string.Format("{0}:{1:00}", Math.Truncate(duration.TotalMinutes), duration.Seconds) 

Обратите внимание, что с помощью TotalMinutes здесь гарантирует, что результат все правильно, когда это заняло больше времени, чем 60 минут.

50

ПРИМЕЧАНИЕ. Этот ответ относится только к .NET 4.0.

Двоеточие является буквальным и должно быть заключено в одинарные кавычки:

duration.ToString("mm':'ss") 

Из MSDN documentation:

Обычай TimeSpan спецификаторов формат не включают заполнитель разделитель символов , такие как символы, которые отдельные дни от часов, часов от минут или секунд от дробного секунд. Вместо этого эти символы должны быть добавлены в пользовательский формат строка в виде строковых литералов.

+2

Не работает для меня ... Я думаю, что проблема заключается в TimeSpan, поскольку DateTime работает – tanascius

+0

'TimeSpan' не имеет метода' ToString (string) '. – Joey

+0

@tanascius, @Johannes Rössel: Я только заметил, что 'ToString (string)' overload существует только в .NET4. Предыдущие версии фреймворка имеют только простой метод ToString(), который не принимает никаких параметров. – LukeH

2

Попробуйте это:

DateTime startTime = DateTime.Now; 
// Do Stuff 
TimeSpan duration = DateTime.Now.Subtract(startTime); 

Console.WriteLine("[paragraph of information] Total Duration: " + duration.Minutes.ToString("00") + ":" + duration.Seconds.ToString("00")); 
0

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

string.Format("{0}:{1}", duration.Minutes, duration.Seconds); 
+1

С пустой строкой формата, которая будет приятным, пустым результатом ;-) – Joey

+0

Да, хорошая точка. :) Тем не менее, было бы сложно исправить это. – Joel

+0

@Joel: И вы даже не потрудитесь отредактировать свой ответ и исправить его? Вау, ты храбрый! ;) –

0

Основываясь на этой странице MSDN, описывающей метод ToString из TimeSpan, я несколько удивлен тем, что вы можете даже скомпилировать код выше. TimeSpan не имеет перегрузки ToString(), которая принимает только одну строку.

The article также показывает функцию, которую вы можете использовать для форматирования TimeSpan.

+0

Код будет скомпилирован, если OP использует .NET4, но затем будет удаляться во время исполнения 'FormatException', как они описывают. – LukeH

16

По какой-то загадочной причине TimeSpan никогда не получал перегрузки ToString(), поддерживающие форматирование до .NET 4.0. Для более ранних версий, до тех пор, как она положительна, вы можете угнать DateTime.ToString():

 TimeSpan ts = new TimeSpan(0, 2, 8); 
     string s = new DateTime(ts.Ticks).ToString("mm:ss"); 
+0

'ToString (строка)' перегрузка для 'TimeSpan' доступна в .NET4. – LukeH

+1

Код гораздо приятнее, чем принятый ответ. –

0
TimeSpan t = TimeSpan.Parse("13:45:43"); 
Console.WriteLine(@"Timespan is {0}", String.Format(@"{0:yy\:MM\:dd\:hh\:mm\:ss}", t)); 
+0

-1: Ваш код выдает 'FormatException', поскольку в« TimeSpan »нет понятия лет или месяцев. Кроме того, вызов 'String.Format' не нужен, поскольку' Console.WriteLine' поддерживает композитное форматирование. [MSDN: пользовательский формат TimeSpan] (https://msdn.microsoft.com/en-us/library/ee372287%28v=vs.110%29.aspx). –

11

пользовательского форматирование System.TimeSpan было добавлено в.Net 4, так что теперь вы можете сделать следующее:

string.Format("{0:mm\\:ss}", myTimeSpan); 

(ДОПОЛНЕНО) и вот пример с использованием C# 6 строк интерполяции:

$"{myTimeSpan:hh\\:mm\\:ss}"; //example output 15:36:15 

Короче теперь нужно бежать " : "с символом" \ "(который сам должен быть экранирован, если вы не используете стенографическую строку).

В этой выдержке из страницы MSDN Custom TimeSpan Format Strings объясняется, как избежать «:» и «.». charecters в строке формата:

Обычая спецификаторы формата TimeSpan не включают в себя символы заполнителя разделителей, такие как символы, которые отдельные дни от часов, часы от нескольких минут или секунд от доли секунды. Вместо этого эти символы должны быть включены в строку пользовательского формата в виде строковых литералов. Например, «dd.hh: mm» определяет период (.) Как разделитель между днями и часами и двоеточие (:) как разделитель между часами и минутами.

+1

Трудно найти пример, который не использовал .ToString() –

0

Вы можете использовать приведенный ниже код.

TimeSpan tSpan = TimeSpan.FromSeconds(allTotalInMinutes); 
string tTime = string.Format("{1:D2}:{2:D2}", tSpan.Minutes, tSpan.Seconds); 

Он отобразит форму 34:45.

Надеюсь, это поможет вам.