subtract 2 datetime fields to get the days left difference
Asked Answered
C

8

32

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

Cryosurgery answered 15/12, 2009 at 6:1 Comment(2)
@PRR I object to treating these questions with LMGTFY.Bunnybunow
related: #1839525Bunnybunow
B
80

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.
Bunnybunow answered 15/12, 2009 at 6:14 Comment(2)
Just as a mention, there's an implicit cast to your Counting as nothing of a day (rounding down to the number of full days) answer. int days = (int)difference.TotalDays; You can still use Math to round down. int days = (int)Math.Floor(difference.TotalDays);Vaillancourt
@Pantelis:if i got difference.TotalDays=1.782323 then will this (int)Math.Floor(difference.TotalDays); rounds down to 1????Bulldog
S
5

Use

TimeSpan

DateTime departure = new DateTime(2010, 6, 12, 18, 32, 0);
DateTime arrival = new DateTime(2010, 6, 13, 22, 47, 0);
TimeSpan travelTime = arrival - departure;  
Silverware answered 15/12, 2009 at 6:3 Comment(0)
M
4

The easiest way out is, making use of TimeSpan(). This Subtract function will return you the difference between two dates in terms of time span. Now you can fetch fields like days, months etc. To access days you can make use of Here is the sample code;

VB.Net code;

    Dim tsTimeSpan As TimeSpan
    Dim ldDate1 as Date
    Dim ldDate2 as Date
      'Initialize date variables here
       tsTimeSpan = ldDate1 .Subtract(ldDate2)
       Dim NumberOfDays as integer = tsTimeSpan.days

C#.Net code;

    DateTime lDate1;
    DateTime lDate2;
    TimeSpan tsTimeSpan ;
    int NumberOfDays;
      //Initialize date variables here
      tsTimeSpan = ldDate1 .Subtract(ldDate2);
      NumberOfDays = tsTimeSpan.days;
Madisonmadlen answered 15/12, 2009 at 6:36 Comment(0)
D
2
DateTime dt1 = new DateTime(2009,01,01,00,00,00);
DateTime dt2 = new DateTime(2009,12,31,23,59,59);

int days = (dt2 - dt1).Days;
Debouch answered 15/12, 2009 at 6:9 Comment(0)
A
2

Number of Days Difference

These answers take the number of days as an int from the System.TimeSpan structure that is the result of subtracting two System.DateTime fields...

Quick answer - gets the number of days difference.

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

Alternate answer - uses Math.Abs to ensure it's not a negative number, just in case the dates might be supplied in either order.

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

Some sample data to finish it off using System namespace:

        // sample data
        DateTime date1 = DateTime.Now;
        DateTime date2 = DateTime.Now.AddDays(10);

MSDN References (and more sample code ):

Aphesis answered 15/12, 2009 at 6:11 Comment(0)
C
2
DateTime theDate = DateTime.Today;
int datediff = theDate.Subtract(expiryDate).Negate().Days;
if expiryDate > theDate then you get Negative value: -14
expiryDate is less than theDate then you get positive value: 14

You May obviously want this in a scenario such as

  1. Send a Notification Email 14days before expiry
  2. Send another notification Email 14 days after expiry

You need a difference that could be negative value

Crafty answered 10/4, 2015 at 15:31 Comment(0)
C
1

You should look at TimeSpan.

Cambrai answered 15/12, 2009 at 6:3 Comment(0)
S
0

To get the exact days ignoring the time section

    DateTime d1 = Convert.ToDateTime(DateTime.Now.ToShortDateString());
    DateTime d2 = Convert.ToDateTime(DateTime.Now.AddDays(46).ToShortDateString());

    var days = Convert.ToInt32(d2.Subtract(d1).TotalDays)
Shellbark answered 12/1, 2016 at 16:55 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.