2010-08-23 4 views
13

Я хочу отобразить прошедшее время между двумя датами в строке.Используйте String.Format на TimeSpan для вывода полных секунд без миллисекунд

Скажем, у меня есть следующий код:

DateTime date1 = DateTime.Now(); 
System.Threading.Thread.Sleep(2500); 
DateTime date2 = DateTime.Now(); 

TimeSpan elapsed = date2.substract(date1); 
Console.WriteLine("> {0:hh:mm:ss}", elapsed); 

Что я ожидаю:

> 00:00:03 

Что я получаю:

> 00:00:02.5002500 

Есть ли способ использовать String. Функция форматирования позволяет возвращать только полные секунды?
Я также попытался удалить знаков после запятой с:

elapsed = elapsed.Substract(TimeSpan.FromMiliseconds((double)Timespan.Miliseconds); 

Но это не работает, либо так elapsed.Miliseconds возвращает 500 как Integer.

ответ

18

Изменение

Console.WriteLine("> {0:hh:mm:ss}", elapsed); 

в

Console.WriteLine("> {0:hh\\:mm\\:ss}", elapsed); 

.Net 4 позволяет использовать строки пользовательского формата с TimeSpan. Вы можете найти полное описание доступных спецификаторов формата на странице MSDN Custom TimeSpan Format Strings.

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

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

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

2

Посмотрев на несколько способов сделать это, я, к сожалению, остался с уродливым ответом. Вы не можете использовать Ticks, так как он не возвращает формат правильно, но следующие будут работать:

DateTime date1 = DateTime.Now; 
System.Threading.Thread.Sleep(2500); 
DateTime date2 = DateTime.Now; 

TimeSpan elapsed = date2.Subtract(date1); 

string[] Split = elapsed.ToString().Split('.'); 

string m = Split[0]; // Returns 00:00:02 
+0

хорошим решением, тоже (и, вероятно, наиболее эффективной в отношении производительности). –

+0

мог бы просто создать новый TimeSpan с 0-секундными фрагментами, а затем распечатать его. Формат «g» вместе с CultureInfo.InvariantCulture должен работать нормально –

-6

Там имеют следующие спецификаторы пользовательского формата у (год), M (месяц), d (день), h (час 12), H (час 24), m (минута), s (вторая), f (вторая фракция), F (вторая фракция, конечные нули обрезаны), t (PM или AM) и z часовой пояс).

Следующие примеры демонстрируют, как спецификаторы формата переписываются на выход. [C#]

// create date time 2008-03-09 16:05:07.123  
DateTime dt = new DateTime(2008, 3, 9, 16, 5, 7, 123);  
String.Format("{0:y yy yyy yyyy}", dt); // "8 08 008 2008" year  
String.Format("{0:M MM MMM MMMM}", dt); // "3 03 Mar March" month  
String.Format("{0:d dd ddd dddd}", dt); // "9 09 Sun Sunday" day  
String.Format("{0:h hh H HH}",  dt); // "4 04 16 16"  hour 12/24 
String.Format("{0:m mm}",   dt); // "5 05"   minute 
String.Format("{0:s ss}",   dt); // "7 07"   second  
String.Format("{0:f ff fff ffff}", dt); // "1 12 123 1230" sec.fraction  
String.Format("{0:F FF FFF FFFF}", dt); // "1 12 123 123" without zeroes  
String.Format("{0:t tt}",   dt); // "P PM"   A.M. or P.M.  
String.Format("{0:z zz zzz}",  dt); // "-6 -06 -06:00" time zone 
+2

OP ищет формат * TimeSpan *, а не * DateTime *. –

13

К сожалению, это не возможно форматировать TimeSpan таким же образом, как значение DateTime. Однако вы можете сделать быстрое преобразование, так как TimeSpan и DateTime сохраняют свое значение как тики (в свойстве Ticks).

В своем коде, который будет выглядеть следующим образом:

Console.WriteLine("> {0:hh:mm:ss}", new DateTime(elapsed.Ticks));

UPDATE: Это относится и к .NET 3.5 и более ранние версии .NET 4 делают поддержку форматирования TimeSpans.

+0

Я считаю, что вы хотите «ЧЧ: мм: ss», чтобы это было правильно. Умный трюк, хотя, +1 от меня – fearofawhackplanet

+0

Отличное решение (так как мой Timespan никогда не будет больше 24 часов), а страх-бокс-планета прав: 'HH: mm: ss' имеет больше смысла. –

+2

В .Net 4 вы можете форматировать Timespan так же, как DateTime. Вы можете использовать следующее: {0: hh \\: mm \\: ss}. См. Мой ответ ниже для более подробной информации. –

1

Хм, это противно (как выясняется) - по крайней мере, до .NET 4.0

Если вы идете здесь: http://msdn.microsoft.com/en-us/library/1ecy8h51(v=VS.90).aspx он скажет вам, что нет никакой перегрузки формата для промежутка времени, и что у вас есть чтобы сделать это вручную, например:

 span.Hours.ToString("00") + ":" + 
    span.Minutes.ToString("00") + ":" + 
    span.Seconds.ToString("00") + "." 

Это кажется - по крайней мере, из документации - быть исправлена ​​в .NET 4.0

4

TimeSpan класс имеет Hours, Minutes и Seconds свойств, которые возвращают каждый раз часть отдельно. Поэтому вы можете попробовать:

String.Format(CultureInfo.CurrentCulture, "{0}:{1}:{2}", 
    elapsed.Hours, 
    elapsed.Minutes, 
    elapsed.Seconds) 

Чтобы получить требуемый формат.

Возможно, существует более оптимальный способ, но я еще не нашел его.

-2

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

dt.Subtract(TimeSpan.FromMilliseconds(dt.Millisecond)).ToString(); 
+2

Пожалуйста, добавьте некоторые пояснения! –

+0

Это тоже сработает, но поскольку Framework 4 .NET nativly поддерживает форматирование времени, которое является лучшим решением. –

 Смежные вопросы

  • Нет связанных вопросов^_^