Как я могу String.Format объект TimeSpan с пользовательским форматом в .NET? - PullRequest
175 голосов
/ 22 февраля 2009

Каков рекомендуемый способ форматирования TimeSpan объектов в строку в произвольном формате?

Ответы [ 19 ]

234 голосов
/ 08 декабря 2010

Обратите внимание: этот ответ для .Net 4.0 и выше. Если вы хотите отформатировать TimeSpan в .Net 3.5 или ниже, см. ответ JohannesH .

Пользовательские строки формата TimeSpan были введены в .Net 4.0. Полный список доступных спецификаторов формата можно найти на странице MSDN Пользовательские строки формата TimeSpan .

Вот пример строки формата временного интервала:

string.Format("{0:hh\\:mm\\:ss}", myTimeSpan); //example output 15:36:15

( UPDATE ) и вот пример использования C # 6 для интерполяции строк:

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

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

В этом отрывке со страницы MSDN Пользовательские строки формата TimeSpan объясняется, как экранировать ":" и "." символы в строке формата:

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

90 голосов
/ 22 февраля 2009

Для .NET 3.5 и ниже вы можете использовать:

string.Format ("{0:00}:{1:00}:{2:00}", 
               (int)myTimeSpan.TotalHours, 
                    myTimeSpan.Minutes, 
                    myTimeSpan.Seconds);

Код взят из Jon Skeet ответ в байтах

Для .NET 4.0 и выше, см. DoctaJonez answer .

31 голосов
/ 22 февраля 2009

Один из способов - создать объект DateTime и использовать его для форматирования:

new DateTime(myTimeSpan.Ticks).ToString(myCustomFormat)

// or using String.Format:
String.Format("{0:HHmmss}", new DateTime(myTimeSpan.Ticks))

Это то, как я знаю. Я надеюсь, что кто-то может предложить лучший способ.

10 голосов
/ 09 августа 2010

Simple. Используйте TimeSpan.ToString с c, g или G. Дополнительная информация по MSDN

7 голосов
/ 29 июня 2015

Я бы пошел с

myTimeSpan.ToString("hh\\:mm\\:ss");
6 голосов
/ 19 ноября 2012
Dim duration As New TimeSpan(1, 12, 23, 62)

DEBUG.WriteLine("Time of Travel: " + duration.ToString("dd\.hh\:mm\:ss"))

Работает для Framework 4

http://msdn.microsoft.com/en-us/library/ee372287.aspx

5 голосов
/ 22 ноября 2013

Лично мне нравится такой подход:

TimeSpan ts = ...;
string.Format("{0:%d}d {0:%h}h {0:%m}m {0:%s}s", ts);

Вы можете сделать это так, как вам нравится, без проблем:

string.Format("{0:%d}days {0:%h}hours {0:%m}min {0:%s}sec", ts);
string.Format("{0:%d}d {0:%h}h {0:%m}' {0:%s}''", ts);
5 голосов
/ 14 апреля 2010

Это потрясающе:

string.Format("{0:00}:{1:00}:{2:00}",
               (int)myTimeSpan.TotalHours,
               myTimeSpan.Minutes,
               myTimeSpan.Seconds);
3 голосов
/ 19 ноября 2012

Вы также можете пойти с:

Dim ts As New TimeSpan(35, 21, 59, 59)  '(11, 22, 30, 30)    '
Dim TimeStr1 As String = String.Format("{0:c}", ts)
Dim TimeStr2 As String = New Date(ts.Ticks).ToString("dd.HH:mm:ss")

EDIT:

Вы также можете посмотреть Strings.Format .

    Dim ts As New TimeSpan(23, 30, 59)
    Dim str As String = Strings.Format(New DateTime(ts.Ticks), "H:mm:ss")
3 голосов
/ 01 июля 2016
if (timeSpan.TotalDays < 1)
    return timeSpan.ToString(@"hh\:mm\:ss");

return timeSpan.TotalDays < 2
    ? timeSpan.ToString(@"d\ \d\a\y\ hh\:mm\:ss")
    : timeSpan.ToString(@"d\ \d\a\y\s\ hh\:mm\:ss");

Все буквенные символы должны быть экранированы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...