我想要减去两个不同的日期,但是当我尝试显示减去的值时,它会与标题中的消息 - An unhandled exception of type 'System.FormatException' occurred in mscorlib.dll
一起崩溃。奇怪的是,我在尝试显示DateTime
时使用了相同的方法。
这是我的(编辑过的)代码:
//works fine
DateTime startingTime = DateTime.Now;
System.Windows.MessageBox.Show(startingTime.ToString("HH:mm:ss", CultureInfo.InvariantCulture));
Thread.Sleep(1000);
//works fine
DateTime newTime = DateTime.Now;
System.Windows.MessageBox.Show(newTime.ToString("HH:mm:ss", CultureInfo.InvariantCulture));
//EXCEPTION
System.Windows.MessageBox.Show((newTime - startingTime).ToString("HH:mm:ss", CultureInfo.InvariantCulture));
我也尝试使用TimeSpan
和newTime.Subtract(startingTime)
,但这会返回相同的异常。
仅当我尝试以我的格式解析它时才会出现异常 - HH:mm:ss
。如果我只使用ToString()
,它可以正常工作,但这不是我想要的格式。
答案 0 :(得分:4)
由于newTime - startingTime
返回TimeSpan
,格式与DateTime
格式不同。
我相信这会奏效;
string.Format("{0:HH\\:mm\\:ss}", (newTime - startingTime))
但这适用于.NET Framework 4+。如果使用.NET 3.5或更低版本,则可以使用;
TimeSpan ts = newTime - startingTime;
string.Format("{0:00}:{1:00}:{2:00}",
(int)ts.TotalHours,
ts.Minutes,
ts.Seconds);
答案 1 :(得分:1)
您应该使用:
(newTime - startingTime).ToString("c")
它将TimeSpan
格式化为hh:mm:ss
。由于此默认格式不区分区域性,因此无需传递CultureInfo
。
或者,为了避免毫秒问题(只是Soner更好的第二个答案的替代方案):
TimeSpan.FromSeconds(Math.Floor(newTime - startingTime.TotalSeconds)).ToString("c")