减去2个日期时间字段以获得剩余天数差异

时间:2009-12-15 06:01:30

标签: c# datetime timespan

如果有人能帮助我减去2个日期时间字段以获得剩余天数,我将不胜感激。

8 个答案:

答案 0 :(得分:80)

使用C#非常容易。 为了比较DateTimes,我们有一个名为 TimeSpan 的类。在这种情况下,TimeSpan结构将被定义为,作为两个日期时间之间的差异

假设你的DateTimes被称为开始和结束。

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

我们已将日期时间设定为2009年6月14日和2009年12月14日。

现在,让我们找到两者之间的区别。为此,我们创建了一个TimeSpan:

TimeSpan difference = end - start;

使用此TimeSpan对象,您可以通过多种不同方式表达时间差异。但是,你特意要求天数的差异,所以这是你如何得到的:

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

因此,该属性称为 TimeSpan.Days


最终守则

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

有关使用TimeSpan结构的更多信息,请参阅this MSDN documentation(尤其是C#示例)。

希望我帮忙!

更新:有些答案建议您在一步中进行减法操作,例如:

int days = (dt2 - dt1).Days;

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

然而,它们与我的答案相同,只是缩短了。这是因为 DateTime.Subtract()方法和DateTimes的减法运算符返回TimeSpan ,然后您可以从中访问天数。我特意在我的代码示例中使用了较长的方法,以便您清楚地了解DateTime和TimeSpan对象之间发生的事情以及它们如何工作。当然,我刚提到的其他方法也很好。

更新#2:

以前曾问过一个非常类似的问题,可以找到here。然而,这个问题的主要问题是为什么代码样本(基本上等同于所有答案的代码样本)有时提供了一个假日的答案。我认为这对这个问题也很重要。

正如另一个问题的主要答案所示,您可以使用此代码:

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

此代码使用Math.Ceiling,根据MSDN,它是:

  

返回最小的整数值   大于或等于   指定的双精度   浮点数。

你想如何计算天数?

因此,我们现在对您计算日期的方式存在问题。你想把一天中的一部分(例如一天中的.5)算作:

  • 一整天 - 这会使用Math.Ceiling来对TimeSpan.TotalDays进行舍入,这样就可以计算开始日期。
  • 部分时间 - 您只需将TimeSpan.TotalDays(非舍入)作为小数返回(在double数据类型中)
  • 没什么 - 您可以忽略一天中的那一部分,只返回TimeSpan.Days。

以下是上述代码示例:

计算一整天(使用Math.Ceiling()进行舍入):

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

计算为一天的一部分(不使用Math.Ceiling(),而是以十进制形式作为一天的一部分):

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

算上一天中的任何事情(四舍五入到完整天数):

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

答案 1 :(得分:5)

使用

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;  

答案 2 :(得分:4)

最简单的方法是使用TimeSpan()。 此Subtract函数将根据时间跨度返回两个日期之间的差异。现在,您可以获取日期,月份等字段。要访问日期,您可以使用 以下是示例代码;

VB.Net代码;

    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代码;

    DateTime lDate1;
    DateTime lDate2;
    TimeSpan tsTimeSpan ;
    int NumberOfDays;
      //Initialize date variables here
      tsTimeSpan = ldDate1 .Subtract(ldDate2);
      NumberOfDays = tsTimeSpan.days;

答案 3 :(得分: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;

答案 4 :(得分:2)

天数差异

这些答案将int结构中System.TimeSpan的天数视为减去两个System.DateTime字段的结果......

快速回答 - 获取天数差异。

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

替代回答 - 使用Math.Abs​​确保它不是负数,以防日期可能以任何顺序提供。

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

要完成using System命名空间的一些示例数据:

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

MSDN参考(以及更多示例代码):

答案 5 :(得分: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

你可能显然想要这样的场景,比如

  1. 在到期前14天发送通知电子邮件
  2. 在到期后14天发送另一封电子邮件通知
  3. 您需要的差异可能是负值

答案 6 :(得分:1)

你应该看看TimeSpan

答案 7 :(得分:0)

获取忽略时间段的确切天数

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

    var days = Convert.ToInt32(d2.Subtract(d1).TotalDays)