ChatGPT解决这个技术问题 Extra ChatGPT

Calculate difference between two dates (number of days)?

I see that this question has been answered for Java, JavaScript, and PHP, but not C#. So, how might one calculate the number of days between two dates in C#?

I found this pretty useful really.. getting a list of dates between start date and end date Hope this helps anyone seeking this in particular in the future :)
The addition and subtraction operators are overloaded for the DateTime and TimeSpan types as you would expect. It's all pretty straightforward. -- What exact problem did you encounter?
int TotalDays = (YourEndDate - YourStartDate).TotalDays

R
Rohit

Assuming StartDate and EndDate are of type DateTime:

(EndDate - StartDate).TotalDays

This answer is obviously correct, but you can also use (a - b).Days if you are interested in the total days as an int rather than a double with a decimal representation of the partial day difference.
this will return 1 less days, 08/31/2013-08/01/2013=31 but this is returning 30 only.
@JasRajBishnoi - you might want to check your maths. What is 31 - 1?
JasRaj was also right in a sense that inclusive both dates it returns a day less in difference. It all depends upon the perspective.
@FahadAbidJanjua It's not a matter or perspective but a matter of time, I mean, the time part of the date. 08/31/2013 - 08/01/2013 really means 08/31/2013 00:00:00 - 08/01/2013 00:00:00 which explains why it's 30 days, because the 08/31/2013 day is just starting. That also explains why, when querying on a DateTime property/field, the proper condition to get a range is "DateTimeProperty >= FromDate && DateTimeProperty < ToDate.AddDays(1)"
S
Selim Yildiz

The top answer is correct, however if you would like only WHOLE days as an int and are happy to forgo the time component of the date then consider:

(EndDate.Date - StartDate.Date).Days

Again assuming StartDate and EndDate are of type DateTime.


The best answer because "numbers of days" normally means whole days. It's worth noting that Days doesn't stop at 365 (as other properties like Hours, Minutes, Second which nax value is where the next higher property begins). Its the same as TotalDays but without fractions of a day and returning int instead of double.
Will this always work as expected? For example, if one of the days being compared is a "spring ahead" Daylight Saving Time day, could the subtraction produce a TimeSpan of 23 hours, and if so, would the value of .Days on that 23-hour time span be 0? (I tried experimenting with this myself, but my results are inconclusive so far - stackoverflow.com/questions/43644252/…)
Yup, this is what I needed - most valuable answer cmon now nobody wants to think about Minutes and Seconds in calculating days
if only 1,5 day has passed this .Days function will show only 1 Day? how i can alter it to show 2 days? i just have to always add + 1 day?
Upvoting this, because very often you would need "CALENDAR days between two dates", not just "number of 24-hour intervals". For example, you need to display an "X days ago" label in a timeline. In this case the difference between "Monday 11:59 pm" and "Tuesday 7:00 am" should be "1 day (ago)"... So the .Date part is really useful. Hope I'm making myself clear
V
Vitaliy Liptchinsky

Use TimeSpan object which is the result of date substraction:

DateTime d1;
DateTime d2;
return (d1 - d2).TotalDays;

Upvoted simply because it makes it clear that the (d1 - d2) will return a TimeSpan object.
p
pyrocumulus

I think this will do what you want:

DateTime d1 = DateTime.Now;
DateTime d2 = DateTime.Now.AddDays(-1);

TimeSpan t = d1 - d2;
double NrOfDays = t.TotalDays;

S
Soner Gönül
DateTime xmas = new DateTime(2009, 12, 25);
double daysUntilChristmas = xmas.Subtract(DateTime.Today).TotalDays;

Anyway to get the days in between in DateTime format? Because I need each date to modify a certain field in tables :) Edit: Got it and posted it as answer below. Thanks
DateTime xmas = new DateTime(DateTime.Today.Year, 12, 25); would make it work on a year by year basis, not just 2009 :)
Subtract() is the OperatorOverload for DateTimes so its the same "(xmas - DateTime.Today).TotalDays - just longer.
P
Peter Mortensen
// Difference in days, hours, and minutes.

TimeSpan ts = EndDate - StartDate;

// Difference in days.

int differenceInDays = ts.Days; // This is in int
double differenceInDays= ts.TotalDays; // This is in double

// Difference in Hours.
int differenceInHours = ts.Hours; // This is in int
double differenceInHours= ts.TotalHours; // This is in double

// Difference in Minutes.
int differenceInMinutes = ts.Minutes; // This is in int
double differenceInMinutes= ts.TotalMinutes; // This is in double

You can also get the difference in seconds, milliseconds and ticks.


k
kingPuppy

In case someone wants numer of whole days as a double (a, b of type DateTime):

 (a.Date - b.Date).TotalDays

This will always be a whole number though (i.e., n.00000) because the Date portion is always midnight.
A
Ama

There often is a debate on time (hours) when it comes to counting days between two dates. The responses to the question and their comments show no exception.

Considering StartDate and EndDate are of type DateTime: if performance is not a concern, I would strongly recommend documenting your calculation through intermediate conversions. For example, (EndDate - StartDate).Days is unintuitive because rounding will depend on the hour component of StartDate and EndDate.

If you want the duration in days to include fractions of days, then as already suggested use (EndDate - StartDate).TotalDays.

If you want the duration to reflect the distance between two days, then use (EndDate.Date - StartDate.Date).Days

If you want the duration to reflect the duration between the morning of the start date, and the evening of the end date (what you typically see in project management software), then use (EndDate.Date - StartDate.Date).Days + 1


R
Rohidas Kadam

You can try this

EndDate.Date.Subtract(DateTime.Now.Date).Days

This actually helped me the best as my date difference was half a day but still when America is 1 day behind Australia I need to see there's actually one day difference. The other answers mentioned in this thread was showing either zero or some double number below 1 which I don't need.
This is the best answer when the purpose is to check if the date has already passed to the next day, no matter if in terms of time is not a full 24h day.
P
Peter Mortensen

Using a timespan would solve the problems as it has many attributes:

DateTime strt_date = DateTime.Now;
DateTime end_date = Convert.ToDateTime("10/1/2017 23:59:59");
//DateTime add_days = end_date.AddDays(1);
TimeSpan nod = (end_date - strt_date);
Console.WriteLine(strt_date + "" + end_date + "" + "" + nod.TotalHours + "");
Console.ReadKey();

P
Peter Mortensen

For a and b as two DateTime types:

DateTime d = DateTime.Now;
DateTime c = DateTime.Now;
c = d.AddDays(145);
string cc;
Console.WriteLine(d);
Console.WriteLine(c);
var t = (c - d).Days;
Console.WriteLine(t);
cc = Console.ReadLine();

P
Peter Mortensen

For beginners like me that will stumble upon this tiny problem, in a simple line, with sample conversion to int:

int totalDays = Convert.ToInt32((DateTime.UtcNow.Date - myDateTime.Date).TotalDays);

This calculates the total days from today (DateTime.UtcNow.Date) to a desired date (myDateTime.Date).

If myDateTime is yesterday, or older date than today, this will give a positive (+) integer result.

On the other side, if the myDateTime is tomorrow or on the future date, this will give a negative (-) integer result due to rules of addition.

Happy coding! ^_^


Couldn't you just use "Days" instead of casting TotalDays? That conversion doesn't even round, it just truncates. if TotalDays is 1.99, your solution will give 1 (which may be what you want).
P
Peter Mortensen

First declare a class that will return later:

public void date()
{
    Datetime startdate;
    Datetime enddate;
    Timespan remaindate;

    startdate = DateTime.Parse(txtstartdate.Text).Date;
    enddate = DateTime.Parse(txtenddate.Text).Date;

    remaindate = enddate - startdate;

    if (remaindate != null)
    {
        lblmsg.Text = "you have left with " + remaindate.TotalDays + "days.";
    }
    else
    {
        lblmsg.Text = "correct your code again.";
    }
}

protected void btncal_Click(object sender, EventArgs e)
{
    date();
}

Use a button control to call the above class. Here is an example:


P
Peter Mortensen

You can use the code below:

 int DateDifInSecond = EndDate.Subtract(StartDate).TotalSeconds

P
Peter Mortensen

Get the difference between the two dates and then get the days from:

int total_days = (EndDate - StartDate).TotalDays

While this code snippet may solve the question, including an explanation really helps to improve the quality of your post. Remember that you are answering the question for readers in the future, and those people might not know the reasons for your code suggestion. Please also try not to crowd your code with explanatory comments, as this reduces the readability of both the code and the explanations!
TotalDays returns a double: msdn.microsoft.com/en-us/library/… So you need a conversion to int
S
Sagar Jadhav

try this truly worked Get actual days diff. date format is "dd/MM/yyyy"

  string[] d1 = txtFromDate.Values.Split('/');
  string[] d2 = txtToDate.Values.Split('/');

  DateTime FrmDt = new DateTime(Convert.ToInt32(d1[2]), Convert.ToInt32(d1[1]), Convert.ToInt32(d1[0]));
  DateTime ToDt = new DateTime(Convert.ToInt32(d2[2]), Convert.ToInt32(d2[1]), Convert.ToInt32(d2[0]));

  TimeSpan TDiff = ToDt.Subtract(FrmDt);
  String DaysDiff = TDiff.TotalDays.ToString();

DateTime.ParseExact exists. You can specify the format without resorting to parsing it manually. This answer doesn't add anything that the existing answers don't already provide.
s
songyuanyao
protected void Calendar1_SelectionChanged(object sender, EventArgs e)
{
    DateTime d = Calendar1.SelectedDate;
    // int a;
    TextBox2.Text = d.ToShortDateString();
    string s = Convert.ToDateTime(TextBox2.Text).ToShortDateString();
    string s1 =  Convert.ToDateTime(Label7.Text).ToShortDateString();
    DateTime dt = Convert.ToDateTime(s).Date;
    DateTime dt1 = Convert.ToDateTime(s1).Date;
    if (dt <= dt1)
    {
        Response.Write("<script>alert(' Not a valid Date to extend warranty')</script>");
    }
    else
    {
        string diff = dt.Subtract(dt1).ToString();
        Response.Write(diff);
        Label18.Text = diff;
        Session["diff"] = Label18.Text;
    }
}   

This code is wrong in so many ways! 1) Lots of Winforms code not related to the question. 2) Wired way of showing message boxes using (I guess an WebBrowser control). 3) using a WebBrowser control to show a text that is shown in label already. 4) Using the OperatorOverload Subtract() (default for "-" operations) which is used for anyway if you do a "MyDateA - MyDateB". 5) No explanation tho this pile of code.