Используйте String.Формат на 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
есть ли способ использовать строку.Функция форматирования только для возврата полных секунд?
Я также попытался удалить десятичные знаки с помощью:
elapsed = elapsed.Substract(TimeSpan.FromMiliseconds((double)Timespan.Miliseconds);
но это не работает с тех пор прошло.Miliseconds возвращает 500 как целое число.
7 ответов
изменить
Console.WriteLine("> {0:hh:mm:ss}", elapsed);
to
Console.WriteLine("> {0:hh\:mm\:ss}", elapsed);
.Net 4 позволяет использовать строки пользовательского формата с Timespan. Вы можете найти полную ссылку на доступные спецификаторы формата в MSDN Пользовательские Строки Формата TimeSpan
к сожалению, невозможно отформатировать TimeSpan
таким же образом, как DateTime
значение. Однако вы можете выполнить быстрое преобразование, потому что TimeSpan и DateTime хранят свое значение как тики (в Ticks
свойства).
в коде это будет выглядеть так:
Console.WriteLine("> {0:hh:mm:ss}", new DateTime(elapsed.Ticks));
обновление: это относится к .NET 3.5 и ранее, .NET 4 поддерживает форматирование временных интервалов.
на TimeSpan
класс Hours
, Minutes
и Seconds
свойства, которые возвращают каждый раз часть в отдельности. Так что вы можете попробовать:
String.Format(CultureInfo.CurrentCulture, "{0}:{1}:{2}",
elapsed.Hours,
elapsed.Minutes,
elapsed.Seconds)
чтобы получить нужный формат.
может быть, есть более оптимальный способ, но я его еще не нашел.
рассмотрев несколько способов сделать это, я, к сожалению, остался с уродливым ответом. Вы не можете использовать Тики, Так как он не возвращает формат должным образом, но будет работать следующее:
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
Хм, это неприятно (как оказалось) - по крайней мере, до .NET 4.0
Если вы идете здесь:http://msdn.microsoft.com/en-us/library/1ecy8h51 (v=VS.90).aspx он скажет вам, что нет перегрузки формата для timespan и что вы должны сделать это вручную, например:
span.Hours.ToString("00") + ":" +
span.Minutes.ToString("00") + ":" +
span.Seconds.ToString("00") + "."
Это, по крайней мере, из документации, будет исправлено в .NET 4.0
есть следующие пользовательские спецификаторы формата y (год), M (месяц), d (день), h (час 12), H (час 24), m (минута), s (вторая), f (вторая фракция), F (вторая фракция, конечные нули обрезаются), t (P. M или A. M) и 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