21

我想在一个字符串中显示两个日期之间经过的时间。

假设我有以下代码:

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.Format 函数只返回整秒?
我还尝试使用以下方法删除小数位:

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

但这也不起作用,因为 elapsed.Miliseconds 返回 500 作为整数。

4

8 回答 8

26

更改

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

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

.Net 4 允许您在 Timespan 中使用自定义格式字符串。您可以在 MSDN自定义时间跨度格式字符串页面上找到可用格式说明符的完整参考。

您需要使用“\”转义“:”字符(除非您使用逐字字符串,否则必须对其本身进行转义)。

MSDN Custom TimeSpan Format Strings页面的这段摘录解释了如何转义“:”和“.”。格式字符串中的字符:

自定义 TimeSpan 格式说明符不包括占位符分隔符,例如将天与小时、小时与分钟或秒与小数秒分开的符号。相反,这些符号必须作为字符串文字包含在自定义格式字符串中。例如,“dd.hh:mm”将句点 (.) 定义为天和小时之间的分隔符,将冒号 (:) 定义为小时和分钟之间的分隔符。

于 2010-09-23T09:34:21.010 回答
13

不幸的是,不可能以与值TimeSpan相同的方式格式化 a DateTime。但是,您可以进行快速转换,因为 TimeSpan 和 DateTime 都将它们的值存储为刻度(在Ticks属性中)。

在您的代码中,如下所示:

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

更新:这适用于 .NET 3.5 及更早版本,.NET 4 确实支持格式化 TimeSpan。

于 2010-08-23T07:41:14.323 回答
5

该类TimeSpan具有Hours,MinutesSeconds属性,它们分别返回每个时间部分。所以你可以尝试:

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

得到你想要的格式。

可能有更优化的方法,但我还没有找到。

于 2010-08-23T08:04:48.833 回答
4

在查看了一些这样做的方法之后,不幸的是,我得到了一个丑陋的答案。您不能真正使用 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
于 2010-08-23T07:34:15.367 回答
2
Timespan duration = endDateTime - startDateTime;
duration.ToString("hh\\:mm\\:ss");
于 2020-05-18T00:34:02.640 回答
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 中修复

于 2010-08-23T08:01:47.887 回答
-2

你可以这样做:

dt.Subtract(TimeSpan.FromMilliseconds(dt.Millisecond)).ToString();
于 2014-06-12T21:01:18.613 回答
-5

有以下自定义格式说明符 y(年)、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
于 2010-08-23T07:35:59.923 回答