Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

subtract 2 datetime fields to get the days left difference

Would appreciate it if anyone can help me figure out to substract 2 datetime fields to get the days left difference.

like image 828
Jobi Avatar asked Dec 15 '09 06:12

Jobi


People also ask

How do I get the difference between two dates in C#?

The difference between two dates can be calculated in C# by using the substraction operator - or the DateTime. Subtract() method. The following example demonstrates getting the time interval between two dates using the - operator.

Can you subtract dates in JavaScript?

Subtract dates using getTime() method And that's how you can subtract dates in JavaScript.


1 Answers

This is very easy to do with C#. For comparing DateTimes, we have a class called TimeSpan. The TimeSpan structure, in this case, would be defined as the difference between your two datetimes.

Let's say that your DateTimes are called start and end.

DateTime start = new DateTime(2009, 6, 14); DateTime end = new DateTime(2009, 12, 14); 

We have established our DateTimes to June 14, 2009 and December 14, 2009.

Now, let's find the difference between the two. To do this, we create a TimeSpan:

TimeSpan difference = end - start; 

With this TimeSpan object, you can express the difference in times in many different ways. However, you specifically asked for the difference in days, so here's how you can get that:

Console.WriteLine("Difference in days: " + difference.Days); 

Thus, the property is called TimeSpan.Days.


Final Code

//establish DateTimes DateTime start = new DateTime(2009, 6, 14); DateTime end = new DateTime(2009, 12, 14);  TimeSpan difference = end - start; //create TimeSpan object  Console.WriteLine("Difference in days: " + difference.Days); //Extract days, write to Console. 

For more information on using the TimeSpan structure, see this MSDN documentation (especially the C# examples).

Hope I helped!

UPDATE: Some answers have suggested taking doing subtraction in one step, such as with:

int days = (dt2 - dt1).Days; 

or

int numDaysDiff = Math.Abs(date2.Subtract(date1).Days); 

However, they are the same thing as in my answer, only shortened. This is because the DateTime.Subtract() method and the subtraction operator of DateTimes returns a TimeSpan, from which you can then access the amount of days. I have specifically used the longer approach in my code sample so that you clearly understand what is going on between your DateTime and TimeSpan objects and how it all works. Of course, the other approaches I just mentioned are fine, too.

UPDATE #2:

A very similar question was asked before, and it can be found here. However, the main point of that question was why the code sample (which is essentially equivalent to that of all the answers) sometimes provides an answer which is a day off. I think this is also important to this question.

As the main answer to the other question suggests, you can use this code:

int days = (int)Math.Ceiling(difference.TotalDays); 

This code uses Math.Ceiling, which, according to MSDN, is:

Returns the smallest integral value that is greater than or equal to the specified double-precision floating-point number.

How Do You Want to Count the Days?

Thus, we now have an issue with how you want to count the days. Do you want to count part of a day (such as .5 of a day) as:

  • A full day - this would use Math.Ceiling to round up TimeSpan.TotalDays, so that you're counting started days.
  • Part of a day - you can just return the TimeSpan.TotalDays (not rounded) as a decimal (in the double datatype)
  • Nothing - you can ignore that part of a day and just return the TimeSpan.Days.

Here are code samples for the above:

Counting as a full day (using Math.Ceiling() to round up):

//establish DateTimes DateTime start = new DateTime(2009, 6, 14); DateTime end = new DateTime(2009, 12, 14);  TimeSpan difference = end - start; //create TimeSpan object  int days = (int)Math.Ceiling(difference.TotalDays); //Extract days, counting parts of a day as a full day (rounding up).  Console.WriteLine("Difference in days: " + days); //Write to Console. 

Counting as part of a day (NOT using Math.Ceiling(), instead leaving in decimal form as a part of a day):

//establish DateTimes DateTime start = new DateTime(2009, 6, 14); DateTime end = new DateTime(2009, 12, 14);  TimeSpan difference = end - start; //create TimeSpan object  double days = difference.TotalDays; //Extract days, counting parts of a day as a part of a day (leaving in decimal form).  Console.WriteLine("Difference in days: " + days); //Write to Console. 

Counting as nothing of a day (rounding down to the number of full days):

//establish DateTimes DateTime start = new DateTime(2009, 6, 14); DateTime end = new DateTime(2009, 12, 14);  TimeSpan difference = end - start; //create TimeSpan object  int days = difference.TotalDays; //Extract days, counting parts of a day as nothing (rounding down).  Console.WriteLine("Difference in days: " + days); //Write to Console. 
like image 76
Maxim Zaslavsky Avatar answered Oct 09 '22 07:10

Maxim Zaslavsky