Reputation: 17565
I'm working on a C# application, where I'm doing some things and I want to display both the start, intermediate and end timestamps, and now I would like to add their time differences.
I figured it would be easy:
Console.WriteLine($"Start time: {DT_Start.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
Console.WriteLine($"Intermediate time: {DT_Intermediate.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
Console.WriteLine($"End time: {DT_End.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
This is working great. So I thought it would be equally easy to show the differences, so I started with:
Console.WriteLine($"Elapsed times: [{(DT_Intermediate - DT_Start).ToString("HH:mm:ss.fff")}] " +
$"and [{(DT_End - DT_Intermediate).ToString("HH:mm:ss.fff")}]");
I had dropped the year, month and day because everything is done in the same day. This did not work, so I decided to add those entries, but it still does not work:
Console.WriteLine($"Elapsed times: [{(DT_Intermediate - DT_Start).ToString("yyyy-MM-dd HH:mm:ss.fff")}] " +
$"and [{(DT_End - DT_Intermediate).ToString("yyyy-MM-dd HH:mm:ss.fff")}]");
So, in C#, you can show datetime objects and you can subtract them. The results, when debugging, are very similar but if you try to show that information in the same way, you get the error message System.FormatException: 'Input string was not in the correct format.'
.
Is there a format I can use for both DateTime
and TimeSpan
objects? (I've seen that the difference between two DateTime
objects would be a TimeSpan
object)
Upvotes: 0
Views: 92
Reputation: 388233
As you have discovered yourself, the difference between two DateTime
objects is a TimeSpan
which just represents the difference of time that has passed. Since a TimeSpan is not linked to a calendar date, you cannot format it using calendar specific things like months and years.
However, your initial approach of only showing hours, minutes and seconds does work just fine. However, you will need to escape the colon and dot when wanting to use it in a TimeSpan format string. And also, the HH
for the hours in the DateTime is written as lower-case hh
for TimeSpan:
Console.WriteLine((DT_Intermediate - DT_Start).ToString("hh\\:mm\\:ss\\.fff"));
// ^^^^ ^^ ^^
// lower-case hh and escaped characters
So in your example, this should work:
Console.WriteLine($"Elapsed times: [{(DT_Intermediate - DT_Start).ToString("hh\\:mm\\:ss\\.fff")}] " +
$"and [{(DT_End - DT_Intermediate).ToString("hh\\:mm\\:ss\\.fff")}]");
Note that the TimeSpan
also supports days as part of the difference, so if the number of hours in your difference surpasses 24
, you will be missing this difference until you also include the number of days using the format specifier d
in your result.
You can read more about formatting TimeSpan
in the documentation about custom format strings.
Upvotes: 1
Reputation: 70
You can use the DateTime.Subtract Method, it accepts DateTime and TimeSpan Object input. https://learn.microsoft.com/de-de/dotnet/api/system.datetime.subtract?view=net-7.0
Upvotes: 0