计算两个日期之间的差异(天数)?


1092

我看到JavaJavaScriptPHP都回答了这个问题,但C#却没有。那么,如何计算C#中两个日期之间的天数?


7
我发现这真的很有用.. 获取开始日期和结束日期之间的日期列表,希望这对将来特别是寻求帮助的人
有所

如您所料,加法和减法运算符对于DateTimeTimeSpan类型是重载的。这一切都非常简单。-您遇到了什么确切的问题?
BrainSlugs83 '18

Answers:


2012

假设StartDateEndDate类型DateTime

(EndDate - StartDate).TotalDays

549
这个答案显然是正确的,但(a - b).Days如果您对总天数感兴趣,也可以使用inta而不是double用部分天差的十进制表示形式。
PFranchise

25
这将少返回1天,即08/31 / 2013-08 / 01/2013 = 31,但这仅返回30天。
JRB

60
@JasRajBishnoi-您可能想检查一下数学。31-1是多少?
格雷格·比奇

33
JasRaj在某种意义上也是正确的,包括两个日期在内,它返回的日差减少了一天。这完全取决于视角。
Fahad Abid Janjua

28
@FahadAbidJanjua这不是问题或观点,而是时间问题,我的意思是,日期的时间部分。2013年8月31日-2013年8月1日实际上是指2013年8月31日00:00:00-2013年8月1日00:00:00解释了为什么要30天,因为2013年8月31日是刚刚开始。这也解释了为什么在查询DateTime属性/字段时,获取范围的适当条件是“ DateTimeProperty > = FromDate && DateTimeProperty < ToDate.AddDays(1)”
Miguel Veloso

159

最佳答案是正确的,但是,如果您只希望将整天作为整数,并且乐于放弃日期的时间部分,请考虑:

(EndDate.Date - StartDate.Date).Days

再次假设StartDateEndDate为类型DateTime


7
最佳答案,因为“天数”通常表示整天。值得注意的是,Days它不会在365处停止(就像Hours,一样的其他属性MinutesSecond即nax值是下一个更高的属性开始的位置)。与相同,TotalDays但没有一天的间隔,int而是返回double
蒂姆·施密特

这会一直按预期工作吗?例如,如果要比较的某天是“提前春节”的夏令时,则减法是否可以产生23小时的TimeSpan,如果是,则该23小时时间跨度的.Days值是否为0 ?(我想这个实验我自己,但我的结果是不确定的,到目前为止- stackoverflow.com/questions/43644252/...
乔恩·施耐德

是的,这就是我所需要的-最有价值的答案,现在没人在计算日期时要考虑分钟和秒
solujic

如果仅过了1.5天,Days函数将仅显示1天?我如何将其更改为显示2天?我只需要始终添加+ 1天?
CDrosos

2
支持这一点,因为您经常需要“两个日期之间的日历天”,而不仅仅是“ 24小时间隔数”。例如,您需要在时间轴上显示“ X天前”标签。在这种情况下,“星期一11:59 pm”和“星期二7:00 am”之间的差应为“ 1天(前)”……因此该.Date部分确实很有用。希望我能使自己清楚
亚历克斯(Alex)


47

我认为这将满足您的要求:

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

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

34
DateTime xmas = new DateTime(2009, 12, 25);
double daysUntilChristmas = xmas.Subtract(DateTime.Today).TotalDays;

1
反正以DateTime格式获取之间的日期?因为我需要每个日期来修改表中的某个字段:)编辑:收到并在下面将其发布为答案。谢谢
sys_debug

4
DateTime xmas = new DateTime(DateTime.Today.Year,12,25); 将使它逐年运行,而不仅仅是2009年:)

1
减法()是DateTime是否在OperatorOverload所以它同“(圣诞节- DateTime.Today).TotalDays -只是更长的时间。
马克·

20

如果有人希望将整天数加倍(ab类型DateTime):

 (a.Date - b.Date).TotalDays

3
但是,该日期始终是整数(即n.00000),因为“日期”部分始终为午夜。
JoeNCA

20
// 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

您还可以得到以秒,毫秒和刻度为单位的差异。


10

你可以试试这个

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

2
实际上,这对我帮助最大,因为我的日期差是半天,但是当美国比澳大利亚晚1天时,我需要看看实际上存在一天差。在该线程中提到的其他答案是显示零或低于1的一些双数,我不需要。
巴里·古文卡亚

当目的是检查日期是否已经过去到第二天时,这是最好的答案,而不管时间是否不是整天的24小时。
oneberenjena

4

对于像我这样的初学者,只需简单地将样本转换为int,就可以偶然发现这个小问题:

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

这将计算从今天(DateTime.UtcNow.Date)到所需日期(myDateTime.Date)的总天数。

如果myDateTime是昨天或早于今天的日期,这将给出一个正(+)整数结果。

另一方面,如果myDateTime是明天或将来的日期,由于加法则,这将得出负(-)整数结果。

编码愉快!^ _ ^


4

使用时间跨度将解决问题,因为它具有许多属性:

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();

3

对于ab作为两种DateTime类型:

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();

0

首先声明一个类,稍后再返回:

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();
}

使用按钮控件来调用上述类。这是一个例子:


0

您可以使用以下代码:

 int DateDifInSecond = EndDate.Subtract(StartDate).TotalSeconds

0

获取两个日期之间的差,然后从中获取日期:

int total_days = (EndDate - StartDate).TotalDays

1
尽管此代码段可以解决问题,但提供说明确实有助于提高您的帖子质量。请记住,您将来会为读者回答这个问题,而这些人可能不知道您提出代码建议的原因。也请尽量不要在代码中添加解释性注释,因为这会降低代码和解释的可读性!
再见StackExchange,

2
TotalDays返回一个双精度值:msdn.microsoft.com/en-us/library/…因此,您需要转换为int
qnguyen

-21
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;
    }
}   

21
这段代码在很多方面都是错误的!1)许多与问题无关的Winforms代码。2)使用(我猜是WebBrowser控件)显示消息框的有线方式。3)使用WebBrowser控件显示已在标签中显示的文本。4)使用OperatorOverload Subtract()(“-”操作的默认值),如果您执行“ MyDateA-MyDateB”,则无论如何都将使用它。5)这堆代码没有解释。
2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.