Dominique
Dominique

Reputation: 17565

How to show DateTime objects and their differences in a logical way?

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

Answers (2)

poke
poke

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

Merithor
Merithor

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

Related Questions