我想在字符串中显示两个日期之间的经过时间。
假设我有以下代码:
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作为整数后,这也不起作用。
答案 0 :(得分:21)
更改
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”将句点(。)定义为天和小时之间的分隔符,并将冒号(:)定义为小时和分钟之间的分隔符。
答案 1 :(得分:13)
不幸的是,无法以与TimeSpan
值相同的方式格式化DateTime
。但是,您可以进行快速转换,因为TimeSpan和DateTime都将其值存储为刻度(在Ticks
属性中)。
在您的代码中看起来像这样:
Console.WriteLine("> {0:hh:mm:ss}", new DateTime(elapsed.Ticks));
更新:这适用于.NET 3.5及更早版本,.NET 4支持格式化TimeSpans。
答案 2 :(得分:4)
TimeSpan
课程包含Hours
,Minutes
和Seconds
个属性,每个属性都会单独返回。所以你可以试试:
String.Format(CultureInfo.CurrentCulture, "{0}:{1}:{2}",
elapsed.Hours,
elapsed.Minutes,
elapsed.Seconds)
获取所需的格式。
可能有一种更优化的方式,但我还没有找到它。
答案 3 :(得分: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
答案 4 :(得分:2)
Timespan duration = endDateTime - startDateTime;
duration.ToString("hh\\:mm\\:ss");
答案 5 :(得分: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中修复
答案 6 :(得分:-2)
你可以这样做:
dt.Subtract(TimeSpan.FromMilliseconds(dt.Millisecond)).ToString();
答案 7 :(得分:-4)
有以下自定义格式说明符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